2011-06-18 207 views
3

我想在sql server 2005中使用group by和rollup子句,但我遇到了一些問題。group by by rollup

這是一個簡單的轉儲

create table group_roll (
id int identity, 
id_name int, 
fname varchar(50), 
surname varchar(50), 
qty int 
) 

go 
insert into group_roll (id_name,fname,surname,qty) values (1,'john','smith',10) 
insert into group_roll (id_name,fname,surname,qty) values (1,'john','smith',30) 
insert into group_roll (id_name,fname,surname,qty) values (2,'frank','white',5) 
insert into group_roll (id_name,fname,surname,qty) values (1,'john','smith',8) 
insert into group_roll (id_name,fname,surname,qty) values (2,'frank','white',10) 
insert into group_roll (id_name,fname,surname,qty) values (3,'rick','black',10) 
go 

如果我運行這個簡單的查詢

select id_name,fname,surname,sum(qty) as tot 
from group_roll 
group by id_name,fname,surname 

我得到

1 john smith 48 
2 frank white 15 
3 rick black 10 

我想有

1 john smith 48 
2 frank white 15 
3 rick black 10 
Total    73 

這是我一直在努力,達到我的目標

select 
case when grouping(id_name) = 1 then 'My total' else cast(id_name as char) end as Name_id , 
fname,surname,sum(qty) as tot 
from group_roll 
group by id_name,fname,surname 
with rollup 
order by case when id_name is null then 1 else 0 end, tot desc 

,但我的結果是

1        john smith 48 
1        john NULL 48 
1        NULL NULL 48 
2        frank white 15 
2        frank NULL 15 
2        NULL NULL 15 
3        rick black 10 
3        rick NULL 10 
3        NULL NULL 10 
My total       NULL NULL 73 

哪裏是我的錯?

編輯。 我能解決我的問題作出

select * from (
select cast(id_name as char) as id_name,fname,surname,sum(qty) as tot 
from group_roll 
group by id_name,fname,surname 
union 
select 'Total',null,null,sum(qty) from group_roll) as t 
order by case when id_name = 'Total' then 1 else 0 end,tot desc 

,但我想了解是否可以彙總解決我的問題。

+0

我對我的方式出了門,並且還爲時過早上週六,我想清楚了,但也許試圖通過FNAME +姓分組,而不是兩個單獨的字段+1 – jlnorsworthy

回答

3

不能語句本身內做到這一點,但你可以過濾ROLLUP集不包括中間彙總,即其中的任何一個,但不是所有的行進行分組:

select 
    case when grouping(id_name) = 1 then 'My total' else cast(id_name as char) end as Name_id, 
    fname, 
    surname, 
    sum(qty) as tot 
from group_roll 
group by id_name, fname, surname 
with rollup 
having grouping(id_name) + grouping(fname) + grouping(surname) in (0 , 3) 

或類似的解決方案,但引用原始查詢;

;with T as (
    select cast(id_name as varchar(128)) as id_name,fname,surname,sum(qty) as tot 
    from group_roll 
    group by id_name,fname,surname 
) select * from T union all select 'Total:',null,null, SUM(tot) from T 

FWIW SQL 2008允許;

select 
    case when grouping(id_name) = 1 then 'My total' else cast(id_name as char) end as Name_id, 
    fname, 
    surname, 
    sum(qty) as tot 
from group_roll 
group by grouping sets((id_name, fname, surname),()) 
+0

。嗨,亞歷克斯。非常感謝你爲這個偉大的答案。 ;) –