使用集合函数时,SQL 语言对空集进行不同的处理。没有 GROUP BY 子句时,对于包含零输入行的集合函数,查询将返回单个行作为结果。在使用 COUNT 的情况下,其结果将为值零;而对于所有其它集合函数,其结果将为 NULL。但是,如果查询中包含
GROUP BY 子句,并且对该查询的输入为空,则查询的结果为空并且不返回行。
例如,以下查询返回具有值 0 的单个行;这说明在部门 103 中没有雇员。
SELECT COUNT() FROM Employees WHERE DepartmentID = 103;
但一下已修改的查询不返回行,因为存在 GROUP BY 子句。
SELECT COUNT() FROM Employees WHERE DepartmentID = 103 GROUP BY State;
GROUP BY 的一个常见错误是试图获取无法正确放入一个组中的信息。例如,下面的查询会生成一个错误。
SELECT SalesRepresentative, Surname, COUNT( * )
FROM SalesOrders KEY JOIN Employees
GROUP BY SalesRepresentative;
该错误消息表示,对 Surname 列的引用也必须出现在 GROUP BY 子句中。之所以发生错误,是因为 SQL Anywhere 无法验证对于给定 ID 的雇员,每个结果行是否都具有相同的姓氏。
要解决此问题,请将该列添加到 GROUP BY 子句。
SELECT SalesRepresentative, Surname, COUNT( * )
FROM SalesOrders KEY JOIN Employees
GROUP BY SalesRepresentative, Surname
ORDER BY SalesRepresentative;
如果这不适用,则可以改用集合函数来仅选择一个值:
SELECT SalesRepresentative, MAX( Surname ), COUNT( * )
FROM SalesOrders KEY JOIN Employees
GROUP BY SalesRepresentative
ORDER BY SalesRepresentative;
MAX 函数从每个组的详细信息行中选择 Surname 最大值(按字母顺序排在最后的姓氏)。由于只能有一个不同的最大值,所以该语句有效。在本例中,相同的 Surname 会出现在一个组中的每个详细信息行上。