上一篇我们讲了count聚合函数的基本功能,以及在2005、2008版本中新增的over partition by来实现分组计数的功能。
在SQL Server 2012、2014中进一步加强了count的功能,使得count在配合over时,一共有3种用法。
1、count(*) over(partition by 分组字段 )
这种用法在上一篇中已将讲过,是2005、2008中新增的功能。
2、count(*) over(partition by 分组字段 order by 字段)
这种用法就是先按照分组字段分组,然后在每一个分组中排序,那么这个时候count计算的是一个 累积的值。
3、count(*) over(order by 字段 )
这种用法就是把所有数据作为一个分组,然后排序,那么这个时候count计算的是一个 累积的值。
下面是例子:
select *,
count(*) over(partition by groupname ) 每个组的个数, --2005/2008
count(*) over(partition by groupname order by id) 每个组的累积个数, --2012/2014
count(*) over(order by id) 累积个数 --2012/2014
from test
/*
id name groupname 每个组的个数 每个组的累积个数 累积个数
1 小明 开发部 3 1 1
4 小张 开发部 3 2 2
5 小白 开发部 3 3 3
8 小王 财务部 3 1 4
9 NULL 财务部 3 2 5
15 小刘 财务部 3 3 6
16 小高 行政部 4 1 7
18 小王 行政部 4 2 8
23 小李 行政部 4 3 9
29 小吴 行政部 4 4 10
*/
附上建表语句:
if object_id('test') is not null
drop table test
go
create table test
(
id int primary key,
name varchar(20),
groupname varchar(20)
)
insert into test
values(1,'小明','开发部'),
(4,'小张','开发部'),
(5,'小白','开发部'),
(8,'小王','财务部'),
(9, null,'财务部'),
(15,'小刘','财务部'),
(16,'小高','行政部'),
(18,'小王','行政部'),
(23,'小李','行政部'),
(29,'小吴','行政部');