GROUPING

用在含有 CUBE、ROLLUP 或 GROUPING SETS 的 SQL 语句中,用于表示进行 CUBE、ROLLUP 或 GROUPING SETS 操作的列是否汇总。当结果集中的数据行是 CUBE、ROLLUP 或 GROUPING SETS 操作产生的汇总结果时,该函数返回 1,否则返回 0。GROUPING 函数可以在 SELECTHAVINGORDER BY 子句当中使用。

Syntax

  1. GROUPING( <column_expression> )

Arguments

<column_expression> 是在 GROUP BY 子句中包含的列或表达式。

Return Types

BIGINT

Remarks

ROLLUPCUBEGROUPING SETS 操作返回的汇总结果,会用 NULL 充当被分组的字段的值。因此,GROUPING 通常用于区分 ROLLUPCUBEGROUPING SETS 返回的空值与表中的空值。

Example

下面的例子使用 camp 列进行分组操作,并对 occupation 的数量进行汇总,GROUPING 函数作用于 camp 列。

  1. CREATE TABLE `roles` (
  2. role_id INT,
  3. occupation VARCHAR(32),
  4. camp VARCHAR(32),
  5. register_time DATE
  6. )
  7. UNIQUE KEY(role_id)
  8. DISTRIBUTED BY HASH(role_id) BUCKETS 1
  9. PROPERTIES (
  10. "replication_allocation" = "tag.location.default: 1"
  11. );
  12. INSERT INTO `roles` VALUES
  13. (0, 'who am I', NULL, NULL),
  14. (1, 'mage', 'alliance', '2018-12-03 16:11:28'),
  15. (2, 'paladin', 'alliance', '2018-11-30 16:11:28'),
  16. (3, 'rogue', 'horde', '2018-12-01 16:11:28'),
  17. (4, 'priest', 'alliance', '2018-12-02 16:11:28'),
  18. (5, 'shaman', 'horde', NULL),
  19. (6, 'warrior', 'alliance', NULL),
  20. (7, 'warlock', 'horde', '2018-12-04 16:11:28'),
  21. (8, 'hunter', 'horde', NULL);
  22. SELECT
  23. camp,
  24. COUNT(occupation) AS 'occ_cnt',
  25. GROUPING(camp) AS 'grouping'
  26. FROM
  27. `roles`
  28. GROUP BY
  29. ROLLUP(camp); -- CUBE(camp) GROUPING SETS((camp)) 同样也有效;

结果集在 camp 列下有两个 NULL 值,第一个 NULL 值表示 ROLLUP 操作的列的汇总结果,这一行的 occ_cnt 列表示所有 campoccupation 的计数结果,在 grouping 函数中返回 1。第二个 NULL 表示 camp 列中本来就存在的 NULL 值。

结果集如下:

  1. +----------+---------+----------+
  2. | camp | occ_cnt | grouping |
  3. +----------+---------+----------+
  4. | NULL | 9 | 1 |
  5. | NULL | 1 | 0 |
  6. | alliance | 4 | 0 |
  7. | horde | 4 | 0 |
  8. +----------+---------+----------+
  9. 4 rows in set (0.01 sec)

See Also

GROUPING_ID