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
廣告