6、进一步了解WHERE和HAVING语句

  如果你对何时应该使用WHERE,何时使用HAVING仍旧很迷惑,请遵照下面的说明:

  ● WHERE语句在GROUP BY语句之前;SQL会在分组之前计算WHERE语句。

  ● HAVING语句在GROUP BY语句之后;SQL会在分组之后计算HAVING语句。

  7、使用聚合函数统计分组数据

  分组数据可以帮助我们分析数据,但是有时我们可能需要更多的信息而不仅仅是分组。你可以使用聚合函数来统计分组数据。例如,下面的语句显示每批订购单的总价钱。

SELECT OrderID, Sum(Cost * Quantity) AS OrderTotal

FROM Orders GROUP BY OrderID

  对于其它的分组来说,SELECT和GROUP BY列必须匹配。而SELECT语句包含聚合函数时这一规则是一个例外。

  8、统计聚合数据

  你可以继续统计数据为每个分组显示一个分类统计。SQL的ROLLUP操作符可以为每个分组显示一个额外的分类统计。这个分类统计是使用聚合函数计算每个分组中的所有记录得到的结果。下面的语句为每个分组计算OrderTotal:

SELECT Customer, OrderNumber, Sum(Cost * Quantity)

AS OrderTotal FROM Orders GROUP BY Customer,

OrderNumber WITH ROLLUP

  对于有两个分别为20和25 OderTotal值的分组,ROLLUP显示一个OrderTotal值45。ROLLUP结果中的第一条记录是的,因为它是计算所有分组记录,这个值是整个记录集的总值。

  ROLLUP在聚合函数中不支持 DISTINCT,也不支持GROUP BY ALL语句。

  9、统计每个列

  CUBE操作符比ROLLUP更进一步,它返回每个分组中重复值的个数。它的结果和ROLLUP相同,但是对每位客户的每一列CUBE包含一个额外的记录。下面的语句显示每个分组的统计和额外每位客户的统计。

SELECT Customer, OrderNumber, Sum(Cost * Quantity)

AS OrderTotal FROM Orders GROUP BY Customer,

OrderNumber WITH CUBE

  CUBE可以给综合的统计。它不仅完成聚合和ROLLUP的功能,还可以计算定义分组的其它列,换句话说,CUBE统计每个可能的列组合。

  CUBE不支持GROUP BY ALL语句。

  10、对统计结果排序

  当CUBE的结果令人迷惑时(它经常是这样),可以添加一个GROUPING函数,如下所示:

SELECT GROUPING(Customer), OrderNumber,

Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP

BY Customer, OrderNumber WITH CUBE

  结果中每行包含两个额外的值:

  ● 值1表示左边的值是一个统计值,是ROLLUP或CUBE的操作符。

  ● 值0表示左边的值是一条由初的GROUP BY语句产生的详细记录。