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
展开
 我来答
ireray5
2011-12-12 · TA获得超过396个赞
知道小有建树答主
回答量:557
采纳率:0%
帮助的人:358万
展开全部
--如果临时表存在,删除
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 行受影响)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式