对列、别名和函数进行分组,构成 SELECT 语句的组成部分。
GROUP BY | group-by-term, ... ] | simple-group-by-term, ... WITH ROLLUP | simple-group-by-term, ... WITH CUBE |GROUPING SETS ( group-by-term, ... )
group-by-term : simple-group-by-term | ( simple-group-by-term, ... ) | ROLLUP ( simple-group-by-term, ... ) | CUBE ( simple-group-by-term, ... )
simple-group-by-term : expression | ( expression ) | ( )
GROUPING SETS 子句 GROUPING SETS 子句允许从单个查询说明中对多个分组执行集合操作。在 GROUPING SET 子句中指定的每个集都等效于 GROUP BY 子句。
例如,以下两个查询是等效的:
SELECT a, b, SUM( c ) FROM t GROUP BY GROUPING SETS ( ( a, b ), ( a ), ( b ), ( ) ); |
SELECT a, b, SUM( c ) FROM t GROUP BY a, b UNION ALL SELECT a, NULL, SUM( c ) FROM t GROUP BY a UNION ALL SELECT NULL, b, SUM( c ) FROM t GROUP BY b UNION ALL SELECT NULL, NULL, SUM( c ) FROM t; |
一个分组表达式可能在结果集中反映为 NULL 值,这要根据结果行所属的分组而定。这样一来,便可能弄不清 NULL 是否是其它分组的结果,或者 NULL 是否是基础数据中实际 NULL 值的结果。要区分输入数据中存在的 NULL 值与分组运算符插入的 NULL 值,请使用 GROUPING 函数。
如果在 GROUPING SETS 子句中指定一组空括号 ( ),则会返回一个包含全部集合的行。
ROLLUP 子句 ROLLUP 子句可用于在单个查询说明中指定多个分组说明,在这一点上它与 GROUPING SETS 子句非常类似。n 个 simple-group-by-term 的 ROLLUP 子句生成 n+1 个分组集,这些分组集的构成方式是:以空括号开头,然后从左到右追加连续的 group-by-term。
例如,以下两个语句是等效的:
SELECT a, b, SUM( c ) FROM t GROUP BY ROLLUP ( a, b ); |
SELECT a, b, SUM( c ) FROM t GROUP BY GROUPING SETS ( ( a, b ), a, ( ) ); |
可以在 GROUPING SETS 子句内使用 ROLLUP 子句。
CUBE 子句 CUBE 子句可用于在单个查询说明中指定多个分组说明,在这一点上它与 ROLLUP 和 GROUPING SETS 子句非常类似。CUBE 子句用于表示可由 CUBE 子句中列出的表达式形成的所有可能的组合。
例如,以下两个语句是等效的:
SELECT a, b, SUM( c ) FROM t GROUP BY CUBE ( a, b, c ); |
SELECT a, b, SUM( c ) FROM t GROUP BY GROUPING SETS ( ( a, b, c ), ( a, b ), ( a, c ), ( b, c ), a, b, c, () ); |
可以在 GROUPING SETS 子句内使用 CUBE 子句。
当使用 GROUP BY 子句时,可以按表达式(具有某些限制)、列、别名或函数分组。查询结果中有一行专用于显示每个分组集的各个不同值(或值集)。
空的 GROUP BY 列表 (),表示将整个输入作为单个组进行处理。例如,以下两个语句是等效的:
SELECT COUNT(), SUM(Salary) FROM Employees; |
SELECT COUNT(), SUM(Salary) FROM Employees GROUP BY (); |
SQL/2008 GROUP BY 是 SQL/2008 标准的核心功能。GROUPING SETS、GROUP BY ()、ROLLUP 和 CUBE 是可选 SQL/2008 语言功能 T431 的构成部分。SQL Anywhere 不支持可选 SQL/2008 语言功能 T432 "嵌套并连接的 GROUPING SETS"。
GROUP BY 子句的服务商扩充包括:
WITH ROLLUP
WITH CUBE
将任意表达式指定为 GROUP BY 条件的功能。在 SQL/2008 标准中,每个 GROUP BY 条件必须是查询的 FROM 子句中基础表的某个列引用。
以下示例返回显示订单总数的结果集,然后提供每年(2000 年和 2001 年)的订单数小计。
SELECT year ( OrderDate ) Year, Quarter ( OrderDate ) Quarter, count(*) Orders FROM SalesOrders GROUP BY ROLLUP ( Year, Quarter ) ORDER BY Year, Quarter; |
如同上一个 ROLLUP 操作示例,以下 CUBE 查询示例返回一个显示订单总数的结果集,并提供每年(2000 年和 2001 年)的订单数小计。与 ROLLUP 不同,此查询还给出了每个季度(1、2、3 和 4)的订单数小计。
SELECT year (OrderDate) Year, Quarter ( OrderDate ) Quarter, count(*) Orders FROM SalesOrders GROUP BY CUBE ( Year, Quarter ) ORDER BY Year, Quarter; |
以下示例返回一个提供 2000 年和 2001 年订单数小计的结果集。GROUPING SETS 操作可用于选择要进行小计的列,而不是像 CUBE 操作那样返回小计的所有组合。
SELECT year (OrderDate) Year, Quarter ( OrderDate ) Quarter, count(*) Orders FROM SalesOrders GROUP BY GROUPING SETS ( ( Year, Quarter ), ( Year ) ) ORDER BY Year, Quarter; |
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |