分组统计group

   日期:2017-06-15

分组查询是查询中很重要的功能,用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
结果的区别是没有男女的汇总。