请教一个联合查询统计问题?
我有一张表,结构如下:
A B C D F
---------------------------
a1 b2 d 20 25
a1 b2 d 20 5
a1 b3 d 20 24
a2 b1 d 14 36
-------------------------------
得如下结构,对字段D F 进行汇总,按A B
A B C D f
---------------------------------
a1 b2 d 40 30
a1 b3 d 20 24
小计 60 54
a2 b1 d 14 36
小计 14 36
合计: 74 90
在线等,加30分
问题点数:30、回复次数:11Top
1 楼hudan(路弯弯其不好走兮,吾将上下而求索)回复于 2004-07-02 23:59:51 得分 0
select a,b,c,sum(d),sum(f)
from yourTable
GROUP BY a,b,c
WITH ROLLUP
Top
2 楼hudan(路弯弯其不好走兮,吾将上下而求索)回复于 2004-07-03 00:01:54 得分 0
不是用WITH ROLLUP 就是用WITH CUBE,记不清了,自己试一下
Top
3 楼lang8848(程序狂)回复于 2004-07-03 16:07:28 得分 0
上面的语句我运行后不符合我的要求,使用后,它将字段A B C 都有小计,我只是想对字段A有小计,最后有合计就可以了。
急等回复。Top
4 楼xiangsu(不孝子,奮發圖強!)回复于 2004-07-04 08:39:25 得分 0
create table #temp(A varchar(10),B varchar(10),C varchar(10),D int,F int)
insert into #temp
select 'a1','b2','d','20','25'
union select 'a1','b2','d','20','5'
union select 'a1','b3','d','20','24'
union select 'a2','b1','d','14','36'
declare @A varchar(10),
@A_pre varchar(10)
set @A=''
set @A_pre=''
declare cur_1 cursor for select A from #temp order by A
open cur_1
fetch cur_1 into @A
while @@fetch_status=0
begin
if @A='' or @A=@A_pre
set @A_pre=@A
else
begin
insert into #temp
select A,'X','X',sum(D),sum(F) from #temp
where A=@A_pre group by A
set @A_pre=@A
end
fetch cur_1 into @A
end
insert into #temp
select A,'X','X',sum(D),sum(F) from #temp
where A=@A_pre group by A
insert into #temp
select 'X','X','X',sum(D),sum(F) from #temp
where B<>'X' and C<>'X'
deallocate cur_1
select * into #temp2 from #temp order by A,B,C
update #temp2
set A='小計',B='',C=''
where A<>'X' and B='X' and C='X'
update #temp2
set A='合計',B='',C=''
where A='X'
select * from #temp2
drop table #temp,#temp2
/*
運行結果:
A B C D F
---------- ---------- ---------- ----------- -----------
a1 b2 d 20 5
a1 b2 d 20 25
a1 b3 d 20 24
小計 60 54
a2 b1 d 14 36
小計 14 36
合計 74 90
(影響 7 個資料列)
*/Top
5 楼lang8848(程序狂)回复于 2004-07-05 09:51:50 得分 0
我用了一下的确可以,但如果A字段的值为汉字时,最后的结果是合数显示在了第一行,然后是小计,然后是明细记录。Top
6 楼xiangsu(不孝子,奮發圖強!)回复于 2004-07-05 10:05:08 得分 0
照上述,是漢字也行,最後結果不能再order by 一次
否則會排序就會混亂...Top
7 楼lang8848(程序狂)回复于 2004-07-05 10:08:25 得分 0
能否具体一点吗?Top
8 楼zjcxc(邹建)回复于 2004-07-05 10:09:25 得分 30
--测试
--测试数据
create table tb(A varchar(10),B varchar(10),C varchar(10),D int,E int)
insert tb select 'a1','b2','d',20,25
union all select 'a1','b2','d',20,5
union all select 'a1','b3','d',20,24
union all select 'a2','b1','d',14,36
go
--查询
select A=case grouping(A) when 1 then '合计'
else case grouping(B) when 1 then '小计'
else A end end
,B=case grouping(B) when 1 then '' else B end
,C=case grouping(B) when 1 then '' else max(C) end
,D=sum(D),E=sum(E)
from tb
group by A,B with rollup
go
--删除测试
drop table tb
/*--测试结果
A B C D E
---------- ---------- ---------- ----------- -----------
a1 b2 d 40 30
a1 b3 d 20 24
小计 60 54
a2 b1 d 14 36
小计 14 36
合计 74 90
(所影响的行数为 6 行)
--*/
Top
9 楼huwgao(小楼听雨)回复于 2004-07-05 10:24:42 得分 0
declare @t table (a varchar(10),b varchar(10),c varchar(10),d int,e int)
insert into @t
select '测试1','速度','d',20,25 union all
select '测试1','阿速','d',20,25 union all
select '测试1','阿速','d',20,25 union all
select '测试2','全文','d',20,25 union all
select '测试2','全文','d',20,25
select * from @t
select isnull(a,'合计') as a,isnull(b,'小计') as b,
min(c) as c,sum(d) as d,sum(e) as e
from @t
group by a,b with rollup
----返回结果
(所影响的行数为 5 行)
a b c d e
---------- ---------- ---------- ----------- -----------
测试1 速度 d 20 25
测试1 阿速 d 20 25
测试1 阿速 d 20 25
测试2 全文 d 20 25
测试2 全文 d 20 25
(所影响的行数为 5 行)
a b c d e
---------- ---------- ---------- ----------- -----------
测试1 阿速 d 40 50
测试1 速度 d 20 25
测试1 小计 d 60 75
测试2 全文 d 40 50
测试2 小计 d 40 50
合计 小计 d 100 125
(所影响的行数为 6 行)
Top
10 楼lang8848(程序狂)回复于 2004-07-05 10:50:10 得分 0
zjcxc(邹建),你的很正确,给你加分,能不能留下MSN 或QQ 我们以后联系Top
11 楼xiangsu(不孝子,奮發圖強!)回复于 2004-07-05 13:47:04 得分 0
555 ~~~ 我寫了這麼長,竟然沒分 !!Top




