SQL GROUPING()函数
聚合是将对象集合绑定在一起作为单个实体。 SQL的 GROUPING() 函数用于验证group by子句中的列表达式是否聚合。如果给定的列表达式聚合,则此函数返回1,否则返回0。
此函数用于区分常规行中的NULL和表示超级聚合行中的所有值集的NULL(由ROLLUP操作生成)。
< p> 只有在指定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、名称、年龄、地址和薪水。现在我们正在使用INSERT语句向客户表中插入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);
客户表格将如下所示−
+----+----------+-----+-----------+---------+
| 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 |
+----+----------+-----+-----------+---------+
下面是使用分组函数按年龄分组并对薪水总额进行聚合的查询:
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子句中使用分组函数。当指定having子句时,我们可以使用分组函数仅检索超累加行或仅检索累加行,下面是一个示例:
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()函数来对两列进行分组。对于每一列,grouping函数在该列生成的空值是通过rollup操作产生的时返回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 |
+------+------+----------+--------------+---------------+