2011-06-18 10 views
3

SQL Server 2005内でgroup byをrollup句で使用しようとしていますが、何か問題があります。私はこの単純なクエリを実行する場合グループ句とロールアップ

は、これは私が取得

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

シンプルダンプ

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 

ある

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 

のですか?

EDIT。 私は

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 

を作る私の問題を解決することができますが、私はロールアップは私の問題を解決することができるかどうかを理解したいと思います。あなたは文自体の中にそれを行うことはできません、しかし、あなたは中間ロールアップ除くROLLUPセットをフィルタリングすることができ

+0

私はドアの外私の方法で、と私ははっきりと考えることが土曜日には時期尚早だが、多分、むしろ両方のフィールドを個別 – jlnorsworthy

答えて

3

、すなわちいずれかではなく、すべての行がグループ化されています:

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

+1よりも、fnameは+姓でグループ化してみてください。こんにちは、アレックス。この素晴らしい答えをありがとう。 ;) –

関連する問題