Group By All [expressions] :
Group By All + 分组字段, 这个和Group By [Expressions]的形式多了一个关键字ALL。这个关键字只有在使用了where语句且where条件筛选掉了一些组的情况下才可以看出效果。在SQL Server 2000的联机帮助中,对于Group By All是这样进行描述的:
如果使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生的所有组,即使某些组没有符合搜索条件的行。没有 ALL 关键字,包含 GROUP BY 子句的 SELECT 语句将不显示没有符合条件的行的组。
其中有这么一句话“如果使用ALL关键字,那么查询结果将包含由Group By子句产生的所有组...没有ALL关键字,那么不显示不符合条件的行组。”这句话听起来好像挺耳熟的,对了,好像和LEFT JOIN 和 RIGHT JOIN 有点像。其实这里是类比LEFT JOIN来进行理解的。还是基于如下这样一个数据集:
FruitName
|
ProductPlace
|
Price
|
Apple
|
China
|
$1.1
|
Apple
|
Japan
|
$2.1
|
Apple
|
USA
|
$2.5
|
Orange
|
China
|
$0.8
|
Banana
|
China
|
$3.1
|
Peach
|
USA
|
$3.0
|
首先我们不使用带ALL关键字的Group By语句:
1
2
3
4
5
6
7
|
SELECTCOUNT(*)
AS
水果种类,ProductPlaceAS出产国
FROMT_TEST_FRUITINFO
WHERE
(ProductPlace<>
'Japan'
)
GROUPBYProductPlace
|
那么在最后结果中由于Japan不符合where语句,所以分组结果中将不会出现Japan。
如今我们加入ALL关键字:
1
2
3
4
|
SELECTCOUNT(*)
AS
水果种类,ProductPlaceAS出产国
FROMT_TEST_FRUITINFO
WHERE
(ProductPlace<>
'Japan'
)
GROUPBYALLProductPlace
|
重新运行后,我们可以看到Japan的分组,但是对应的“水果种类”不会进行真正的统计,聚合函数会根据返回值的类型用
默认值0或者NULL来代替聚合函数的返回值。