SQL - GROUPING() 函数



聚合是将多个对象绑定在一起形成单个实体的集合。SQL 的GROUPING() 函数用于验证 group by 子句中的列表达式是否已聚合。如果给定的列表达式已聚合,则此函数返回 1,否则返回 0。

此函数用于区分常规行中的 NULL 和表示超级聚合行中所有值的集合的 NULL(由 ROLLUP 操作生成)。

Grouping 仅可在指定 GROUP BY 时与 SELECT、LIST、HAVING、ORDER BY 子句一起使用。

语法

以下是 SQL GROUPING() 函数的语法:

GROUPING(column_expression);

参数

  • column_expression - 它是在 GROUP BY 子句中包含列的列或表达式。

示例

假设我们使用以下查询创建了一个名为 customer 的表:

CREATE TABLE customers(ID INT NOT NULL, 
   NAME VARCHAR(30) NOT NULL, 
   AGE INT NOT NULL,
   ADDRESS CHAR(30), 
   SALARY DECIMAL(18, 2)
);

该表存储 ID、NAME、AGE、ADDRESS 和 SALARY。现在我们使用 INSERT 语句在 customers 表中插入 7 条记录。

INSERT INTO customers VALUES(1, 'Ramesh', 32, 'Ahmedabad', 2000.00);
INSERT INTO customers VALUES(2, 'Khilan', 25, 'Delhi', 1500.00);
INSERT INTO customers VALUES(3, 'kaushik', 23, 'Kota', 2000.00);
INSERT INTO customers VALUES(4, 'Chaitali', 25, 'Mumbai', 6500.00);
INSERT INTO customers VALUES(5, 'Hardik', 27, 'Bhopal', 8500.00);
INSERT INTO customers VALUES(6, 'Komal', 22, 'MP', 4500.00);
INSERT INTO customers VALUES(7, 'Aman', 23, 'Ranchi', null);

customers 表将如下所示:

+----+----------+-----+-----------+---------+
| ID | NAME     | AGE | ADDRESS   | SALARY  |
+----+----------+-----+-----------+---------+
|  1 | Ramesh   |  32 | Ahmedabad | 2000.00 |
|  2 | Khilan   |  25 | Delhi     | 1500.00 |
|  3 | kaushik  |  23 | Kota      | 2000.00 |
|  4 | Chaitali |  25 | Mumbai    | 6500.00 |
|  5 | Hardik   |  27 | Bhopal    | 8500.00 |
|  6 | Komal    |  22 | MP        | 4500.00 |
|  7 | Aman     |  23 | Ranchi    |    NULL |
+----+----------+-----+-----------+---------+

以下是使用 grouping 函数按年龄分组并聚合工资金额的查询:

SELECT AGE, SUM(SALARY) as SALARY_SUM, GROUPING(AGE) AS 'GROUPING' FROM customers GROUP BY AGE WITH ROLLUP;

输出

以下是上述 SQL 查询的输出,它显示 AGE 下一个空值。空值是由 ROLLUP 操作添加的汇总行。汇总行显示所有年龄组的工资总和,这由 GROUPING 列中的 1 表示:

+------+------------+----------+
| AGE  | SALARY_SUM | GROUPING |
+------+------------+----------+
|   22 |    4500.00 |        0 |
|   23 |    2000.00 |        0 |
|   25 |    8000.00 |        0 |
|   27 |    8500.00 |        0 |
|   32 |    2000.00 |        0 |
| NULL |   25000.00 |        1 |
+------+------------+----------+

示例

我们可以在 select 或 having 子句中使用 grouping 函数。当指定 having 子句时,我们可以使用 grouping 函数仅检索超级聚合行或仅检索聚合行,以下是一个示例:

SELECT AGE, SALARY, SUM(SALARY) 
as SALARY_SUM FROM customers GROUP BY AGE, SALARY 
WITH ROLLUP HAVING GROUPING(AGE) = 1 or GROUPING(SALARY) = 1;

输出

以下是上述 SQL 查询的输出:

+------+--------+------------+
| AGE  | SALARY | SALARY_SUM |
+------+--------+------------+
|   22 |   NULL |    4500.00 |
|   23 |   NULL |    2000.00 |
|   25 |   NULL |    8000.00 |
|   27 |   NULL |    8500.00 |
|   32 |   NULL |    2000.00 |
| NULL |   NULL |   25000.00 |
+------+--------+------------+

示例

在以下示例中,我们对两列使用 grouping() 函数。当为该列生成的 null 是 rollup 操作的结果时,该列的 grouping 函数返回 1 的值。否则,它返回 0 的值。

SELECT 
   ID, AGE, SUM(SALARY) as SUM, GROUPING(ID), GROUPING(AGE)
   FROM customers
   GROUP BY ID, AGE WITH ROLLUP;

输出

以下是上述 SQL 查询的输出:

+------+------+----------+--------------+---------------+
| ID   | AGE  | SUM      | GROUPING(ID) | GROUPING(AGE) |
+------+------+----------+--------------+---------------+
|    1 |   32 |  2000.00 |            0 |             0 |
|    1 | NULL |  2000.00 |            0 |             1 |
|    2 |   25 |  1500.00 |            0 |             0 |
|    2 | NULL |  1500.00 |            0 |             1 |
|    3 |   23 |  2000.00 |            0 |             0 |
|    3 | NULL |  2000.00 |            0 |             1 |
|    4 |   25 |  6500.00 |            0 |             0 |
|    4 | NULL |  6500.00 |            0 |             1 |
|    5 |   27 |  8500.00 |            0 |             0 |
|    5 | NULL |  8500.00 |            0 |             1 |
|    6 |   22 |  4500.00 |            0 |             0 |
|    6 | NULL |  4500.00 |            0 |             1 |
|    7 |   23 |     NULL |            0 |             0 |
|    7 | NULL |     NULL |            0 |             1 |
| NULL | NULL | 25000.00 |            1 |             1 |
+------+------+----------+--------------+---------------+
sql-aggregate-functions.htm
广告