SQL Server compute [by]

compute by 子句可通过同一个select语句既查看明细行,又查看汇总行。可计算子组的汇总值,也可计算整个结果集的汇总值。
1、可选的by关键字,指定按哪一列分组的基础上进行聚合。所以如果使用by关键字,则之前必须使用order by ,并且分组的列和排序的列一致。如果不带by关键字,则是对整个结果集进行汇总。
2、行聚合函数:count,max,min,sum,avg
3、使用compute [by]子句的select语句将产生2个结果集。
(1)一个为select 指定的明细行的结果集。
(2)另一个为compute [by] 指定聚合函数计算的汇总结果集。
 

compute [by]和group by的区别:

1、group by 只有一个结果集。其select的列只能包含分组依据列和聚合函数。

create table Score(
    ScoreID int primary key identity(1,1) not null,
    Sid int foreign key references Student(Sid) not null,
    Pid int foreign key references ProjectTb(Pid) not null,
    Score int
)
insert into dbo.Score(Sid,Pid,Score)
values(1,1,90),(1,2,67),(1,3,84),(2,1,90),(2,2,62),(2,3,87),(3,1,80),(3,2,83),(3,3,89)

select * from dbo.Score

SQL Server compute [by]_第1张图片

select Sid,sum(Score)
from dbo.Score
group by Sid

 

2、compute [by]产生多个结果集。一类结果集为每个组的明细行数据(其中必须但不限于聚合表达式参数列,允许但不强制包含分组依据列)。另一类结果集则为子组的聚合计算结果。

select ScoreID,Pid,Score
from dbo.Score
order by Sid
compute sum(Score) by Sid

SQL Server compute [by]_第2张图片

此处如果select的字段不包括Score,则会报错:COMPUTE 子句 #1、聚合表达式 #1 不在选择列表中。

 

你可能感兴趣的:(SQL,Server)