sql server分组统计数据(一)

2014-11-24 15:27:17 · 作者: · 浏览: 2
sql server分组统计数据
说明:group by是sql中对数据表中的数据进行分组的,在select列表中出现的字段必须全部出现在group by 字段中,出现在聚合函数中的字段在group by中可有可无,没有出现在select列表中的字段在group by中也可以使用。在group by中不可以使用列别名。
语法:
select column_name,aggregate_function(column_name) from table_name where column_name operator value group by column_name

(1)分组计算数据
a.本实例利用sum()函数和group by计算图书销售表(Booksales)中图书的总销售额
select b_code,sum(b_price) from Booksales group by b_code
b.本实例利用avg()函数和group by 计算学生表信息(studenttable) 中男生和女生的平均年龄
select studentsex,avg(studentage) from studenttable group by studentsex
c.本实例利用max()函数和group by 计算学生信息表(studenttable)中男生和女生的最大年龄
select studentsex,max(studentage) from studenttable group by studentsex
d.本实例利用min()函数和group by 计算学生信息表(studenttable)中男生和女生的最小年龄
select studentsex,min(studentage) from studenttable group by studentsex

(2)group by and all
说明:本实例中利用了group by子句和all关键字,在group by 子句中使用all关键字,只有在sql语句中包含where子句时,all才有意义。
a. 查询图书销售表(Booksales)中图书编号为1100010101的图书销售总额,且列出其他图书编号
Select b_code,sum(sal_tot) from Booksales where b_code=’1100010101’ group by all b_code

(3) ROLLUP的使用
说明:ROLLUP关键字是用来生成小计的,利用了with rollup关键字会在结果集的最后显示的行名称为空,而后面对应的值则为计算列的所有值!
a. 利用sum()和with rollup对学生信息表(studenttable)中的所有年龄生成小计
Select studentsex,sum(studentage) from studenttable group by [studentsex] with rollup
b. 利用max()和with rollup 对学生信息表(studenttable) 中的年龄最大值生成小计
Select studentsex,max(studentage) from studenttable group by [studentsex] with rollup
c.利用min()和with rollup对学生信息表(studenttable)中的年龄最小值生成小计
select studentsex,min(studentage) from studenttable group by [studentsex] with rollup
d. 利用avg()和with rollup 对学生表(studenttable)中的年龄平均值生成小计
Select studentsex,avg(studentage) from studenttable group by [studentsex] with rollup
e. 利用count()和with rollup对学生表(studenttable)中的记录数生成小计
Select studentsex,count(*) from studenttable group by [studentsex] with rollup

注意:
当with rollup与sum()一起使用时得出的结果是分组后每组的和的和
当with rollup与max()一起使用时得出的结果是分组后组的较大值
当with rollup与min()一起使用时得出的结果是分组后组的较小值
当with rollup与avg()一起使用时得出的结果是所以记录的平均值
当with rollup与count()一起使用时得出的结果是分组后各组数量的总和
(4)CUBE的使用
说明:CUBE用来生成小计和总计交叉表,group by 分组后由CUBE生成总计和小计!
a. 利用sum()和CUBE对图书销售表(Booksales)中的销售额生成小计和总计
Select b_code,b_number,sum(sal_tot) from Booksales group by b_code,b_number with cube
b. 利用max()和CUBE对图书销售表(Booksales)中的销售额生成小计和总计
Select b_code,b_number,max(sal_tot) from Booksales group by b_code,b_number with cube
c. 利用min()和CUBE对图书销售表(Booksales)中的销售额生成小计和总计
Select b_code,b_number,min(sal_tot) from Booksales group by b_code,b_number with cube
d. 利用avg()和cube对图书销售表(Booksales)中的销售额生成小计和总计
Select b_code,b_number,avg(sal_tot) from Booksales group by b_code,b_number with cube
e. 利用count()和cube对图书销售表(Booksales)中的销售额生成小计和总计
Select b_code,b_number,count(*)from Booksales group by b_code,b_number with cube

(5)where与having的使用
说明:where子句是对select语句的结果进行筛选,having子句则是对group by子句进行筛选,having子句通常和group by子句一起使用,如果不使用group by子句,则having子句的行为和where子句的行为一样,当having和group by all一起使用时,having子句代替all,在having子句中不能使用text,image和ntext类型,where子句是在进行分组之前应用,而having子句则是在分组后应用,having子句可以包含聚合函数,也可以引用选择列表中出现的任何选项,也可以应用group by中的任何选项,having也可引用没有出现在select列表的而出现在group by列表的字段。
a. 使用group by