declare @t table(姓名 nvarchar(10),课程 nvarchar(20),分数 int)
insert into @t select N'王三',N'语文',89
insert into @t select N'王三',N'英语',87
insert into @t select N'王三',N'数学',90
insert into @t select N'李四',N'语文',65
insert into @t select N'李四',N'英语',75
insert into @t select N'李四',N'数学',80
select
case when grouping(课程)=1 then '总分' else 姓名 end as 姓名--指定合计列
,isnull(课程'')
,sum(分数) as 分数
from @t
group by
姓名
,课程
with rollup
having grouping(姓名)=0--禁止全部学生成绩合计
结果:
王三 英语 87
王三 数学 90
王三 语文 89
总分 266
李四 英语 75
李四 数学 80
李四 语文 65
总分 220
----以上引用自CSDN论坛
grouping函数说明:
使用GROUPING 函数时,一般是在有CUBE 或ROLLUP 时使用。
使用GROUPING 函数,其参数就是一个入参,一般就是某个字段名,或者是GROUP BY 子句中使用的表达式。
GROUPING 函数返回值是0 或1.是合计列返回1,不是则返回0.
通过使用GROUPING 函数,你可以发现哪一行是本来的记录,哪一行是小计.也可以发现那些NULL值,是原本数据的NULL值,还是由于CUBE 或ROLLUP 来形成的NULL值。
实际上,GROUPING 函数,在使用CUBE 和ROLLUP 时,非小计的结果行,其函数的返回值肯定是0。在小计的结果行,会根据这个小计是否是这个GROUPING 函数所对应的字段求小计,从而返回0 或1 的结果。
---以上引自"小樽的雨后"博客.