关于sql分类统计的问题!

linapeng 2008-07-07 09:51:57
表结构如下:
DECLARE @t TABLE(a int,b varchar(10),c varchar(10),d money)
INSERT @t SELECT '1','aa','a', 124
UNION ALL SELECT '2','aa','a', -23
INSERT @t SELECT '3','aa','b', 124
UNION ALL SELECT '4','aa','b', -23
INSERT @t SELECT '5','aa','c', 124
UNION ALL SELECT '6','aa','d', -23
INSERT @t SELECT '7','aa','e', 124
UNION ALL SELECT '8','aa','f', -23
INSERT @t SELECT '9','aa','g', 124
UNION ALL SELECT '10','aa','f', -23
UNION ALL SELECT '11','bb' ,'a',-23
UNION ALL SELECT '12','bb','a', 124
UNION ALL SELECT '13','bb','e, -90
UNION ALL SELECT '14','bb' ,'f',-23
UNION ALL SELECT '15','bb','g', 101
UNION ALL SELECT '16','bb','g, -90

要求分多级统计
1,先按字段b进行分类汇总,在按字段c进行分类汇总,
2.统计结果要如下所示:

b c 总计 总额 包含id
---- ----------- ----------- ----------- -----------
aa a 2 101 1,2
aa b 2 101 3,4
aa c 1 124 5
aa d 1 -23 6
aa e 1 124 7
aa f 2 -46 8,10
aa g 1 124 9
aa总计 10 505 1,2,3,4,5,6,7,8,9,10
bb a 2 101 11,12
bb e 1 -90 13
bb f 1 -23 14
bb g 2 11 15,16
bb总计 6 -1 11,12,13,14,15,16













...全文
324 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
linapeng 2008-07-07
  • 打赏
  • 举报
回复
望高手多多帮忙!!
linapeng 2008-07-07
  • 打赏
  • 举报
回复
嗯!很感谢大家!
字段c我想每4个做一次统计,不知道能不能实现!
显示结果如下:
b c 总计 总额
-------------- ---------- ----------- --------------------- ----------------------------------------------------------------------------------------------------
aa a 2 101.00 1,2
aa b 2 101.00 3,4
aa c 1 124.00 5
aa d 1 -23.00 6
aa 總計 6 303 1,2,3,4,5,6
aa e 1 124.00 7
aa f 2 -46.00 8,10
aa g 1 124.00 9
aa 總計 4 202.00 17,8,9,10
bb a 2 101.00 11,12
bb e 1 -90.00 13
bb f 1 -23.00 14
bb g 2 11.00 15,16
bb 總計 6 -1.00 11,12,13,14,15,16


中国风 2008-07-07
  • 打赏
  • 举报
回复
set nocount on ;
DECLARE @t TABLE(a int,b varchar(10),c varchar(10),d money)
INSERT @t SELECT '1 ', 'aa ', 'a ', 124
UNION ALL SELECT '2 ', 'aa ', 'a ', -23
INSERT @t SELECT '3 ', 'aa ', 'b ', 124
UNION ALL SELECT '4 ', 'aa ', 'b ', -23
INSERT @t SELECT '5 ', 'aa ', 'c ', 124
UNION ALL SELECT '6 ', 'aa ', 'd ', -23
INSERT @t SELECT '7 ', 'aa ', 'e ', 124
UNION ALL SELECT '8 ', 'aa ', 'f ', -23
INSERT @t SELECT '9 ', 'aa ', 'g ', 124
UNION ALL SELECT '10 ', 'aa ', 'f ', -23
UNION ALL SELECT '11 ', 'bb ' , 'a ',-23
UNION ALL SELECT '12 ', 'bb ', 'a ', 124
UNION ALL SELECT '13 ', 'bb ', 'e' , -90
UNION ALL SELECT '14 ', 'bb ' , 'f ',-23
UNION ALL SELECT '15 ', 'bb ', 'g ', 101
UNION ALL SELECT '16 ', 'bb ', 'g', -90

select
[b]=case when t.c is null then t.b+'總計' else t.b end,
[c]=isnull(t.c,''),t.总计,t.总额,case when t.c is null then stuff(t3.包含id.value('/R[1]','nvarchar(100)'),1,1,'') else stuff(t2.包含id.value('/R[1]','nvarchar(100)'),1,1,'')end
from
(select b,c,总计=count(1),总额=sum(d) from @t group by b,c with rollup having not (grouping(b)=1 and grouping(c)=1))T
outer apply
(select 包含id=(select N','+rtrim(a) from @T where b=t.b and c=t.c group by a for xml path(''),root('R'),type) )t2
outer apply
(select 包含id=(select N','+rtrim(a) from @T where b=t.b group by a for xml path(''),root('R'),type) )t3


b c 总计 总额
-------------- ---------- ----------- --------------------- ----------------------------------------------------------------------------------------------------
aa a 2 101.00 1,2
aa b 2 101.00 3,4
aa c 1 124.00 5
aa d 1 -23.00 6
aa e 1 124.00 7
aa f 2 -46.00 8,10
aa g 1 124.00 9
aa 總計 10 505.00 1,2,3,4,5,6,7,8,9,10
bb a 2 101.00 11,12
bb e 1 -90.00 13
bb f 1 -23.00 14
bb g 2 11.00 15,16
bb 總計 6 -1.00 11,12,13,14,15,16

中国风 2008-07-07
  • 打赏
  • 举报
回复
set nocount on ;
DECLARE @t TABLE(a int,b varchar(10),c varchar(10),d money)
INSERT @t SELECT '1 ', 'aa ', 'a ', 124
UNION ALL SELECT '2 ', 'aa ', 'a ', -23
INSERT @t SELECT '3 ', 'aa ', 'b ', 124
UNION ALL SELECT '4 ', 'aa ', 'b ', -23
INSERT @t SELECT '5 ', 'aa ', 'c ', 124
UNION ALL SELECT '6 ', 'aa ', 'd ', -23
INSERT @t SELECT '7 ', 'aa ', 'e ', 124
UNION ALL SELECT '8 ', 'aa ', 'f ', -23
INSERT @t SELECT '9 ', 'aa ', 'g ', 124
UNION ALL SELECT '10 ', 'aa ', 'f ', -23
UNION ALL SELECT '11 ', 'bb ' , 'a ',-23
UNION ALL SELECT '12 ', 'bb ', 'a ', 124
UNION ALL SELECT '13 ', 'bb ', 'e' , -90
UNION ALL SELECT '14 ', 'bb ' , 'f ',-23
UNION ALL SELECT '15 ', 'bb ', 'g ', 101
UNION ALL SELECT '16 ', 'bb ', 'g', -90

select
t.*,case when t.c is null then stuff(t3.包含id.value('/R[1]','nvarchar(100)'),1,1,'') else stuff(t2.包含id.value('/R[1]','nvarchar(100)'),1,1,'')end
from
(select b,c,总计=count(1),总额=sum(d) from @t group by b,c with rollup having not (grouping(b)=1 and grouping(c)=1))T
outer apply
(select 包含id=(select N','+rtrim(a) from @T where b=t.b and c=t.c group by a for xml path(''),root('R'),type) )t2
outer apply
(select 包含id=(select N','+rtrim(a) from @T where b=t.b group by a for xml path(''),root('R'),type) )t3


b c 总计 总额
---------- ---------- ----------- --------------------- ----------------------------------------------------------------------------------------------------
aa a 2 101.00 1,2
aa b 2 101.00 3,4
aa c 1 124.00 5
aa d 1 -23.00 6
aa e 1 124.00 7
aa f 2 -46.00 8,10
aa g 1 124.00 9
aa NULL 10 505.00 1,2,3,4,5,6,7,8,9,10
bb a 2 101.00 11,12
bb e 1 -90.00 13
bb f 1 -23.00 14
bb g 2 11.00 15,16
bb NULL 6 -1.00 11,12,13,14,15,16

kk19840210 2008-07-07
  • 打赏
  • 举报
回复
DECLARE   @t   TABLE(a   int,b   varchar(10),c   varchar(10),d   money) 
INSERT @t SELECT '1', 'aa', 'a', 124
UNION ALL SELECT '2', 'aa', 'a', -23
INSERT @t SELECT '3', 'aa', 'b', 124
UNION ALL SELECT '4', 'aa', 'b', -23
INSERT @t SELECT '5', 'aa', 'c', 124
UNION ALL SELECT '6', 'aa', 'd', -23
INSERT @t SELECT '7', 'aa', 'e', 124
UNION ALL SELECT '8', 'aa', 'f', -23
INSERT @t SELECT '9', 'aa', 'g', 124
UNION ALL SELECT '10', 'aa', 'f', -23
UNION ALL SELECT '11', 'bb' , 'a',-23
UNION ALL SELECT '12', 'bb', 'a', 124
UNION ALL SELECT '13', 'bb', 'e', -90
UNION ALL SELECT '14', 'bb' , 'f',-23
UNION ALL SELECT '15', 'bb', 'g', 101
UNION ALL SELECT '16 ', 'bb ', 'g', -90


select * from t


create function get_str(@b varchar(10),@c varchar(10))
returns varchar(100)
as
begin
declare @str varchar(8000)
set @str=''
if @c=''
select @str=@str+cast(a as varchar(2))+',' from t where b=@b
else
select @str=@str+cast(a as varchar(2))+',' from t where b=@b and c=@c
return left(@str,len(@str)-1)
end



select b=case when c is null then b+'总计' else b end,c=isnull(c,''),总计=count(1),总额=sum(d),包含id=dbo.get_str(b,isnull(c,'')) from t group by b,c with ROLLUP

b c 总计 总额 包含id
-------------- ---------- ----------- --------------------- ----------------------------------------------------------------------------------------------------
aa a 2 101.00 1,2
aa b 2 101.00 3,4
aa c 1 124.00 5
aa d 1 -23.00 6
aa e 1 124.00 7
aa f 2 -46.00 8,10
aa g 1 124.00 9
aa总计 10 505.00 1,2,3,4,5,6,7,8,9,10
bb a 2 101.00 11,12
bb e 1 -90.00 13
bb f 1 -23.00 14
bb g 2 11.00 15,16
bb总计 6 -1.00 11,12,13,14,15,16
linapeng 2008-07-07
  • 打赏
  • 举报
回复
好!!!
谢谢哦!!
ahbbdbc 2008-07-07
  • 打赏
  • 举报
回复
楼主可以到我们群了问问题 现在正在问。。。51028890
linapeng 2008-07-07
  • 打赏
  • 举报
回复
fn_test 是怎样一个函数啊????
hery2002 2008-07-07
  • 打赏
  • 举报
回复
select b,c,count(1),sum(d) , fn_test(b,c) as 包含ID from @t group by b,c
中国风 2008-07-07
  • 打赏
  • 举报
回复
05要用xml,2000要用函數
hery2002 2008-07-07
  • 打赏
  • 举报
回复
select b,c,count(1),sum(d) , fn_test(b,c) as 包含ID from @t

fn_test参考风的整理贴,
合并分拆表_整理贴1
http://topic.csdn.net/u/20080612/22/c850499f-bce3-4877-82d5-af2357857872.html

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧