SQL 取出每个分组的第一条记录,同时还显示每个分组某个字段的总和 15
如:tableaABCDa1wba2xya3ztb2gtb1mhb5uq以A字段分组,并取每个分组的第一条记录以及每个分组B字段的值的总和结果:ABCDSUM(B)a1w...
如:table a
A B C D
a 1 w b
a 2 x y
a 3 z t
b 2 g t
b 1 m h
b 5 u q
以A字段分组,并取每个分组的第一条记录以及每个分组B字段的值的总和
结果:
A B C D SUM(B)
a 1 w b 7
b 2 g t 8 展开
A B C D
a 1 w b
a 2 x y
a 3 z t
b 2 g t
b 1 m h
b 5 u q
以A字段分组,并取每个分组的第一条记录以及每个分组B字段的值的总和
结果:
A B C D SUM(B)
a 1 w b 7
b 2 g t 8 展开
1个回答
展开全部
--如果临时表存在,删除
if exists (select * from tempdb.dbo.sysobjects where id = object_id('tempdb.dbo.[##tableA]'))
drop table [dbo].[##tableA]
--以第一条记录创建临时表
--注:根据你的要求,追加了一个用来确定组内记录序号的字段row_order,
-- 因为如果没有这个字段,没有办法实现取得你说的那样的第1条记录的。
select A='a',B=1,C='w',D='b',row_order=1 into ##tableA
--将其余5个记录写入临时表
insert into ##tableA
select 'a', 2, 'x', 'y',row_order=2 union
select 'a', 3, 'z', 't',row_order=3 union
select 'b', 2, 'g', 't',row_order=1 union
select 'b', 1, 'm', 'h',row_order=2 union
select 'b', 5, 'u', 'q',row_order=3
go
--用公共表达式取得即将要输出的结果集
with ABCD as (
select A,B,C,D,row_number() over (partition by A order by row_order ) as 'rowid',
sum(B) over (partition by A) as 'SUMB'
from ##tableA)
--从公式表达式中取得要求的结果
select A,B,C,D,SUMB
from ABCD
where rowid = 1
--删除临时表
if exists (select * from tempdb.dbo.sysobjects where id = object_id('tempdb.dbo.[##tableA]'))
drop table [dbo].[##tableA]
/*
A B C D SUM(B)
a 1 w b 7 注:根据你的数据,应该是6
b 2 g t 8
*/
------------------------------------------------------------------
输出的结果:
A B C D SUMB
---- ----------- ---- ---- -----------
a 1 w b 6
b 2 g t 8
(2 行受影响)
if exists (select * from tempdb.dbo.sysobjects where id = object_id('tempdb.dbo.[##tableA]'))
drop table [dbo].[##tableA]
--以第一条记录创建临时表
--注:根据你的要求,追加了一个用来确定组内记录序号的字段row_order,
-- 因为如果没有这个字段,没有办法实现取得你说的那样的第1条记录的。
select A='a',B=1,C='w',D='b',row_order=1 into ##tableA
--将其余5个记录写入临时表
insert into ##tableA
select 'a', 2, 'x', 'y',row_order=2 union
select 'a', 3, 'z', 't',row_order=3 union
select 'b', 2, 'g', 't',row_order=1 union
select 'b', 1, 'm', 'h',row_order=2 union
select 'b', 5, 'u', 'q',row_order=3
go
--用公共表达式取得即将要输出的结果集
with ABCD as (
select A,B,C,D,row_number() over (partition by A order by row_order ) as 'rowid',
sum(B) over (partition by A) as 'SUMB'
from ##tableA)
--从公式表达式中取得要求的结果
select A,B,C,D,SUMB
from ABCD
where rowid = 1
--删除临时表
if exists (select * from tempdb.dbo.sysobjects where id = object_id('tempdb.dbo.[##tableA]'))
drop table [dbo].[##tableA]
/*
A B C D SUM(B)
a 1 w b 7 注:根据你的数据,应该是6
b 2 g t 8
*/
------------------------------------------------------------------
输出的结果:
A B C D SUMB
---- ----------- ---- ---- -----------
a 1 w b 6
b 2 g t 8
(2 行受影响)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询