GROUPING
语法:
GROUPING(expr)
功能:GROUPING函数用于将由GROUP BY扩展语法(如CUBE和ROLLUP)生成的超级分组记录和普通分组记录区分开来。
超级分组中的记录使用NULL表示所有值的集合,使用GROUPING函数可以把特殊分组记录的NULL值和普通结果集的NULL值区分开来。
GROUPING函数的表达式expr必须出现在GROUP BY表达式列表当中,如果expr的值在null表示的所有值集合的记录中,函数返回1,否则函数返回0。
GROUPING函数的返回值的数据类型是INTEGER。
示例:
--删除表。
DROP TABLE IF EXISTS dimension_tab;
--创建表dimension_tab 。
CREATE TABLE dimension_tab (
fact_1_id NUMBER NOT NULL,
fact_2_id NUMBER ,
fact_3_id NUMBER ,
fact_4_id NUMBER ,
sales_value NUMBER(10,2)
);
--新增记录。
INSERT INTO dimension_tab
SELECT TRUNC(DBMS_RANDOM.value(low => 1, high => 3)) AS fact_1_id,
TRUNC(DBMS_RANDOM.value(low => 1, high => 6)) AS fact_2_id,
TRUNC(DBMS_RANDOM.value(low => 1, high => 11)) AS fact_3_id,
TRUNC(DBMS_RANDOM.value(low => 1, high => 11)) AS fact_4_id,
ROUND(DBMS_RANDOM.value(low => 1, high => 100), 2) AS sales_value
FROM SYS_DUMMY
CONNECT BY level <= 256;
--提交事务。
COMMIT;
--查询。
SELECT fact_1_id,
fact_2_id,
SUM(sales_value) AS sales_value,
GROUPING(fact_1_id) AS f1g,
GROUPING(fact_2_id) AS f2g
FROM dimension_tab
GROUP BY CUBE (fact_1_id, fact_2_id)
HAVING GROUPING(fact_1_id) = 1 OR GROUPING(fact_2_id) = 1
ORDER BY GROUPING(fact_1_id), GROUPING(fact_2_id);
FACT_1_ID FACT_2_ID SALES_VALUE F1G F2G
---------------------------------------- ---------------------------------------- ---------------------------------------- ------------ ------------
3 17575 1
2 23194.55 1
1 24485.15 1
150 1
6 7545 1
5 10652.07 1
4 9951.54 1
1 9578.4 1
7 7460 1
2 10319.11 1
3 9598.58 1
65254.7 1 1
12 rows fetched.
GROUPING_ID
语法:
GROUPING_ID(expr1 [, ..., exprN])
功能:GROUPING_ID返回与行相关的GROUPING位向量对应的数字。
注意:
GROUPING_ID函数仅适用于包含GROUP BY扩展语法(CUBE/ROLLUP/GROUPING SETS)的查询语句当中。在包含多个GROUP BY表达式的的查询语句当中,确定特定记录的GROUP BY级别将需要使用多个GROUPING函数,会导致查询语句很繁琐,GROUPING_ID函数适用此种场景。
GROUPING_ID函数在功能上等同于获取多个GROUPING函数的结果(0或1)并将它们拼接成一个位向量。通过使用GROUPING_ID函数,可以避免使用多个GROUPING函数,使得过滤条件更容易表达,可以使用GROUPING_ID = n条件就过滤出预期记录,GROUPING_ID函数适用于查询存储多重聚合的表数据。
示例:
从表dimension_tab查询出grouping IDs。
--删除表sales。
DROP TABLE IF EXISTS dimension_tab;
--创建表sales。
CREATE TABLE dimension_tab (
fact_1_id NUMBER NOT NULL,
fact_2_id NUMBER ,
fact_3_id NUMBER ,
fact_4_id NUMBER ,
sales_value NUMBER(10,2)
);
--新增数据。
INSERT INTO dimension_tab
SELECT TRUNC(DBMS_RANDOM.value(low => 1, high => 3)) AS fact_1_id,
TRUNC(DBMS_RANDOM.value(low => 1, high => 6)) AS fact_2_id,
TRUNC(DBMS_RANDOM.value(low => 1, high => 11)) AS fact_3_id,
TRUNC(DBMS_RANDOM.value(low => 1, high => 11)) AS fact_4_id,
ROUND(DBMS_RANDOM.value(low => 1, high => 100), 2) AS sales_value
FROM SYS_DUMMY
CONNECT BY level <= 256;
--提交事务。
COMMIT;
SELECT fact_1_id,
fact_2_id,
SUM(sales_value) AS sales_value,
GROUPING_ID(fact_1_id, fact_2_id) AS grouping_id
FROM dimension_tab
GROUP BY CUBE (fact_1_id, fact_2_id)
ORDER BY fact_1_id, fact_2_id;
FACT_1_ID FACT_2_ID SALES_VALUE GROUPING_ID
---------------------------------------- ---------------------------------------- ---------------------------------------- --------------------
1 1 3911.03
1 2 3986.83
1 3 3437.92
1 4 3889.55
1 5 4194.82
1 6 2305
1 7 2700
1 24485.15 1
1 60
2 1 3392.37
2 2 3767.28
2 3 3520.66
2 4 3661.99
2 5 4087.25
2 6 2480
2 7 2240
2 23194.55 1
2 45
3 1 2275
3 2 2565
3 3 2640
3 4 2400
3 5 2370
3 6 2760
3 7 2520
3 17575 1
3 45
1 9578.4 2
2 10319.11 2
3 9598.58 2
4 9951.54 2
5 10652.07 2
6 7545 2
7 7460 2
65254.7 3
150 2
36 rows fetched.