Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询和修改数据 » 查询数据 » 集合函数

 

将集合函数应用于分组数据

除了提供有关整个表的信息之外,集合函数还可应用于行组。GROUP BY 子句将行分组,而集合函数将为每一行组返回一个值。

示例
♦  列出销售代表和每位销售代表获得的订单数

GROUP BY 子句通知 SQL Anywhere 对以其它方式返回的所有行的集合进行分区。每个分区(即组)中的所有行在指定的列中都具有相同的值。每个唯一值或值集仅对应于一个组。在本例中,每组中的所有行都具有相同的 SalesRepresentative 值。

诸如 COUNT 等集合函数适用于每个组中的行。因此,此结果集会显示每个组中行的总数。查询的结果由对应于每个销售代表 ID 号的行组成。每行都包含销售代表 ID 以及该销售代表获得的销售订单总数。

每当使用 GROUP BY 时,结果表中都有一行对应于在 GROUP BY 子句中指定的每个列或列集。请参见GROUP BY 子句:将查询结果划分为组

GROUP BY 常见错误

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 会出现在一个组中的每个详细信息行上。