分组统计group
分组查询是查询中很重要的功能,用group by 子句可以对数据按照某列进行分组。Group by 子句的作用是把from子句中的关系按分组属性划分为若干组,同一组内所有记录在分组属性上具有相同值。即select 子句中不是统计函数的列名必须与group by 后的子句相一致。
Group by子句是指定用来放置输出行的组,如果select子句中包含聚集函数,则计算每组的汇总值,当用户指定的group by 时。Select选择列中任一非聚集表达式的所有列都应包含在group by列表中,或者group by 表达式必须与select选择列表达一致。
Group语法
Group by [all] expression[,---n]
[with{cube | rollup}]
注意使用group时select的要求
在select 子句的字段列表中除了聚集函数外,其他所出现的字段一定要在group by 子句中有定义才行
在select 子句的字段列表中不一定要有聚集函数,但至少要用到group by 子句列表中的一个项目 例:group by a,b,c 则select a 是可以的
在sql server 中text、ntext和image数据类型的字段不能作为group by 子句的分组依据。
Group by子句不能使用字段别名。
1、数据分组统计(单列)
实现在图书库存信息表中将库存图书按出版社统计图书库存金额
Select 出版社,sum(金额)as 合计金额 from biao group by 出版社 order by 2 desc
2、分组查询使用all关键字
只有在sql语句中还包括where子句时,all关键字才有意义。如果使用all关健字,那么查询结果将包括由group by子句产生的所有组,即使某些组没有符合查询条件的行,没有all关键字,包含group by子句的select语句将不显示没有符合条件的行的组。
Select 书名,出版社,sum(金额) as 总计金额 from biao where 出版社=’机械’ group by all 书名,出版社
上条语句把不符合条件的“电子”出版社也显示在结果中了,如果去掉all关键字将只显示“机械”出版社的
3、分组查询使用cube关键字
该参数是指定结果集内不仅包含group by子句提供的正常行,还包含汇总行,在结果集内返回每个group by 组的可能组合的汇总行,如果在结果中显示为NULL表示该列的所有值的汇总
主要作用是自动对group by子句中列出的字段进行分组汇总运算,结果集将包含分组列的所有可能组合,以及与这些维度列组合相匹配的基础行中的聚合值。
Select 所属部门,性别,avg(工资) as 平均工资 from 工资表 group by 所属部门,性别 with cube
结果为
所属部门 性别 平均工资
Asp部 男 1550
Asp部 女 1400
Asp部 1500
设计部 男 1500
设计部 女 1200
设计部 1400
文档部 男 1500
文档部 女 1000
文档部 1125
1320
男 1520
女 1120
4、分组查询使用rollup关键字
也是实现汇总运算与cube类似区别是
Cube生成的结果集显示了所选列中值的所有组合的聚合数据。而rollup生成的结果集显示了对group by子句中第一个分组字段进行汇总计算,如果有两个字段那么先后位置不同结果集也不同。
Select 所属部门,性别,avg(工资) as 平均工资 from 工资表 group by 所属部门,性别 with ROLLUP
结果为
所属部门 性别 平均工资
Asp部 男 1550
Asp部 女 1400
Asp部 1500
设计部 男 1500
设计部 女 1200
设计部 1400
文档部 男 1500
文档部 女 1000
文档部 1125
1320
结果的区别是没有男女的汇总。