带汇总的 group by 子句
我尝试在 sql server 2005 中使用带有汇总子句的 group by 但遇到一些问题。
这是一个简单的转储
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
,但我想了解汇总是否可以解决我的问题。
I'm trying to use group by with rollup clause within sql server 2005 but I'm having some problem.
This is a simple dump
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
If I run this simple query
select id_name,fname,surname,sum(qty) as tot
from group_roll
group by id_name,fname,surname
I get
1 john smith 48
2 frank white 15
3 rick black 10
I'd like to have
1 john smith 48
2 frank white 15
3 rick black 10
Total 73
This is what I've tried to reach my goal
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
but my result is
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
Where is my mistake?
EDIT.
I could solve my problem making
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
but I'd like to understand if rollup can solve my problem.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您无法在语句本身中执行此操作,但是您可以过滤 ROLLUP 集,排除中间汇总,即对任何一行但不是所有行进行分组:
或者与您的解决方案类似,但引用原始查询;
FWIW SQL 2008 允许;
You cannot do it within the statement itself, however you can filter the
ROLLUP
set excluding the intermediate rollups, i.e. where any one but not all rows are being grouped:Or similar to your solution but referencing the original query;
FWIW SQL 2008 allows;