除了提供有关整个表的信息之外,集合函数还可应用于行组。GROUP BY 子句将行分组,而集合函数将为每一行组返回一个值。
在 Interactive SQL 中,执行以下查询:
SELECT SalesRepresentative, COUNT( * ) FROM SalesOrders GROUP BY SalesRepresentative ORDER BY SalesRepresentative; |
SalesRepresentative | count(*) |
---|---|
129 | 57 |
195 | 50 |
299 | 114 |
467 | 56 |
... | ... |
GROUP BY 子句通知 SQL Anywhere 对以其它方式返回的所有行的集合进行分区。每个分区(即组)中的所有行在指定的列中都具有相同的值。每个唯一值或值集仅对应于一个组。在本例中,每组中的所有行都具有相同的 SalesRepresentative 值。
诸如 COUNT 等集合函数适用于每个组中的行。因此,此结果集会显示每个组中行的总数。查询的结果由对应于每个销售代表 ID 号的行组成。每行都包含销售代表 ID 以及该销售代表获得的销售订单总数。
每当使用 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 会出现在一个组中的每个详细信息行上。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |