sql server分组统计数据(二)
与having查询图书销售表(Booksales)中图书销售额大于200的图书编号和销售额
Select b_code,sum(b_price) from Booksales group by b_code having sum(p_price)> 200
b. 使用group by 与having查询图书销售表(Booksales)中图书销售记录大于2条的图书编号和销售额
Select b_code,sum(b_price) from Booksales group by b_code having count(*)>2
c. 使用group by与having查询销售数量大于2并且销售额大于50的图书编号和销售额按销售额降序
Select b_code,sum(b_price) from Booksales where b_number>2 group by b_code having sum(b_price)>50 order by sum(b_price) desc
d. 使用group by与having查询联系方式表(contact)中年龄不为20的id号
select id from contact group by id,ages having ages not in (20)
(6)compute与compute by的使用方法
说明:compute是对聚合函数生成小计的,一个select语句中可以有多个compute指定的聚合函数,注意在compute子句的聚合函数中不可以使用列别名,compute输出的结果为两行,
第一行:生成select_list列表中行的明细
第二行:compute子句中聚合函数的小计
Compute by 则是先实现分组然后统计compute子句中聚合函数小计的,在compute by语句中必须要有order by排序并且排序列和by分组列必须相同
第一行:生成select_list列表中行的明细
第二行:compute子句中聚合函数的小计
两个都是输出compute子句中聚合函数的小计,但是不相同的是compute输出的是聚合列在表中的所有值,而compute by 则是输出先按by子句中的字段分组以后每组的聚合列的值!
a. 查询图书销售表(Booksales)中的总销售额,销售个数 Select * from Booksales compute sum(sal_tot),sum(b_number) b. 查询图书销售表(Booksales)中的销售额最小和最大并按图书编号升序排列 Select * from Booksales order by b_code compute max(sal_tot),min(sal_tot) c. 查询图书销售表(Booksales)中的总销售额,销售个数按b_code分组 select * from Booksales order by b_code compute sum(sal_tot),sum(b_number) by b_code
(7)group by 和 compute by 的比较
说明:group by与compute by都可以进行分组,但是他们有一定的区别
Group by :生成单个结果集,每一行都只有分组依据列和聚合列,选择列表也只能包含分组依据列和聚合列,可排序也可不排序,如果要排序的话只能先分组后排序,排序列必须和分组列相同或者是分组列的子集或者为聚合函数产生的新列,聚合函数写在select列表中,在group by 子句中不可以使用聚合函数、在聚合函数聚合结果中可以使用列别名。
Compute by:生成多个结果集,一种结果集包括选择列表中的行的明细,另一种结果集则包含聚合以后的小计,在compute by 子句中必须排序,并且排序列必须和compute by的中分组列相同,聚合函数写在compute子句中,分组列写在by子句中,分组列可以是表中的任意列,但不可以使用列别名,在聚合函数聚合结果中不可以使用列别名。