靠了,差一点实现不了了

KEDAXIUCAI 2009-02-08 07:04:50
/*create table aa(name varchar(10),class varchar(10),sorce int)
insert aa select '张三','数学','80'
union all select '张三','语文','95'
union all select '李四','语文','95'
union all select '李四','数学','95'
union all select '王五','数学','83'
union all select '王五','语文','95'
go*/


SELECT CASE WHEN (GROUPING(name) = 1) THEN '总计'
ELSE ISNULL(name, 'UNKNOWN')
END AS name,
CASE WHEN (GROUPING(name) = 1) THEN ''
when(grouping(class)=1)then'小计'
ELSE ISNULL(class, 'UNKNOWN')
END AS class,
SUM(sorce) AS sun_grade
FROM aa
GROUP BY name,class WITH ROLLUP

以上代码实现的如下结果:
李四 数学 95
李四 语文 95
李四 小计 190
王五 数学 83
王五 语文 95
王五 小计 178
张三 数学 80
张三 语文 95
张三 小计 175
总计 543


现在我要的结果形式是:
李四 数学 95
李四 语文 95
小计 190
王五 数学 83
王五 语文 95
小计 178
张三 数学 80
张三 语文 95
小计 175
总计 543
我就不会了!请各位给予指点纠正
...全文
162 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
guxiaoshi 2009-02-10
  • 打赏
  • 举报
回复
可以这样做:

select case when (grouping(name)=1) then '合计'
when (grouping(name)=0) And (grouping(class)=1) Then '小计'
Else [name]
end as [name],
IsNULL (class,''),sum(sorce),grouping([name])
from aaa
group by [name],class WITH RoLLUP
王五 語文 95
王五 数学 83
小计 178
張三 語文 95
張三 数学 80
小计 175
李四 語文 95
李四 数学 95
小计 190
合计 543


may_05 2009-02-09
  • 打赏
  • 举报
回复
select AA.* 
from
(
select * from aa
union all
select name,class='小计',sum(sorce) as sorce from aa group by name
) AA
order by name,(select case class when '小计' then 99 end)
lhblxm 2009-02-09
  • 打赏
  • 举报
回复
在你的SQL 前再加一句也可以做到

select case class when '小计' then '小计' else name end as name
,case class when '小计' then '' else class end as class
,sun_grade from(
SELECT CASE WHEN (GROUPING(name) = 1) THEN '总计'
ELSE ISNULL(name, 'UNKNOWN')
END AS name,
CASE WHEN (GROUPING(name) = 1) THEN ''
when(grouping(class)=1)then'小计'
ELSE ISNULL(class, 'UNKNOWN')
END AS class,
SUM(sorce) AS sun_grade
FROM aa
GROUP BY name,class WITH ROLLUP )bb
qlh 2009-02-09
  • 打赏
  • 举报
回复
select (case when class is null then case when name is null then '总计' else '小计' end else name end) as name
,isnull(class,''),sum(sorce) as 成绩 from aa group by name,class with rollup



我觉得你的显示就可以呀,为啥非得搞成下面的显示??
肥龙上天 2009-02-08
  • 打赏
  • 举报
回复

方法二再稍微改进下
select [name] = (case when grouping(name) = 0 and grouping(class) = 1 then '小计'
when grouping(name) = 1 and grouping(class) = 1 then '总计'
else [name] end)
,class = (case when grouping(name) = 0 and grouping(class) = 1 then cast(sum(sorce)as nvarchar(20))
when grouping(name) = 1 and grouping(class) = 1 then cast(sum(sorce)as nvarchar(20))
else class end)
,score = (case when grouping(name) = 1 or grouping(class) = 1 then null else sum(sorce) end)
from aa a
group by name,class with rollup
肥龙上天 2009-02-08
  • 打赏
  • 举报
回复


create table aa (name varchar(10),class varchar(10),sorce int)
insert aa select '张三','数学','80'
union all select '张三','语文','95'
union all select '李四','语文','95'
union all select '李四','数学','95'
union all select '王五','数学','83'
union all select '王五','语文','95'
go

方法一
select
name = (case when name is null then '总计' when class is null then'小计' else name end)
,class =isnull(class,sm)
,sm = isnull(class,null)
from
(
select name,class,sm = sum(sorce)
from aa
group by name,class with rollup
)t

方法二
select [name] = (case when grouping(name) = 0 and grouping(class) = 1 then '小计'
when grouping(name) = 1 and grouping(class) = 1 then '总计'
else [name] end)
,class = (case when grouping(name) = 0 and grouping(class) = 1 then cast((select sum(sorce)from aa where name = a.name )as nvarchar(20))
when grouping(name) = 1 and grouping(class) = 1 then cast((select sum(sorce)from aa)as nvarchar(20))
else class end)
,score = (case when grouping(name) = 1 or grouping(class) = 1 then null else sum(sorce) end)
from aa a
group by name,class with rollup

name class score
---------- -------------------- -----------
李四 数学 95
李四 语文 95
小计 190 NULL
王五 数学 83
王五 语文 95
小计 178 NULL
张三 数学 80
张三 语文 95
小计 175 NULL
总计 543 NULL

(10 row(s) affected)


claro 2009-02-08
  • 打赏
  • 举报
回复
帮顶
dawugui 2009-02-08
  • 打赏
  • 举报
回复
create table aa(name varchar(10),class varchar(10),score int) 
insert aa select '张三','数学','80'
union all select '张三','语文','95'
union all select '李四','语文','95'
union all select '李四','数学','95'
union all select '王五','数学','83'
union all select '王五','语文','95'

select name , class , score from
(
select * , name id from aa
union all
select '小计' name , '' class , sum(score) score , name id from aa group by name
union all
select name = '合计', class = '' , sum(score) score , '' id from aa
) t
order by case id when '' then 2 else 1 end ,
id ,
case class when '' then 2 else 1 end
drop table aa

/*
name class score
---------- ---------- -----------
李四 语文 95
李四 数学 95
小计 190
王五 数学 83
王五 语文 95
小计 178
张三 数学 80
张三 语文 95
小计 175
合计 543

(所影响的行数为 10 行)
*/
KEDAXIUCAI 2009-02-08
  • 打赏
  • 举报
回复
不是,LS你没明白我意思~!
李四 数学 95
李四 语文 95
小计 190
王五 数学 83
王五 语文 95
小计 178
张三 数学 80
张三 语文 95
小计 175
总计 543
我是要改成这样!不知道怎么该了,弄不明白了~~~
dawugui 2009-02-08
  • 打赏
  • 举报
回复
第一种方式好些.
KEDAXIUCAI 2009-02-08
  • 打赏
  • 举报
回复
现在我要的结果形式是:
李四 数学 95
李四 语文 95
小计 190
王五 数学 83
王五 语文 95
小计 178
张三 数学 80
张三 语文 95
小计 175
总计 543
我就不会了!请各位给予指点纠正

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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