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 参考 » 使用 SQL » SQL 语句 » SQL 语句 (E-O)

 

GROUP BY 子句

此子句用于对列、别名和函数进行分组,构成 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 函数 [Aggregate]

    如果在 GROUPING SETS 子句中指定一组空括号 ( ),则会返回一个包含全部集合的行。

    有关在 GROUPING 集中使用空括号的详细信息(包括示例),请参见指定空分组说明

  • ROLLUP 子句   ROLLUP 子句可用于在单个查询说明中指定多个分组说明,在这一点上它与 GROUPING SETS 子句非常类似。nsimple-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 子句。

    有关 ROLLUP 操作的详细信息,请参见使用 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 子句。

    有关 ROLLUP 操作的详细信息,请参见使用 CUBE

  • WITH ROLLUP 子句   这是 ROLLUP 子句的替代语法,是为了与 T-SQL 兼容而提供的。

  • WITH CUBE 子句   这是 CUBE 子句的替代语法,是为了与 T-SQL 兼容而提供的。

注释

当使用 GROUP BY 子句时,可以按列、别名或函数分组。查询结果中有一行专用于显示每个分组集的各个不同值(或值集)。

另请参见
标准和兼容性
  • SQL/2003   尽管 GROUP BY 子句是核心特性,但 GROUPING SETS、ROLLUP 和 CUBE 是核心 SQL 之外的特性。例如,ROLLUP 子句是特性 T431 的一部分。WITH ROLLUP 和 WITH CUBE 是服务商扩充。

示例

以下示例返回显示订单总数的结果集,然后提供每年(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;