GROUPING SETS是SQL标准中的多维聚合运算符,允许在单个查询中实现多维度组合的分组统计。相较于传统UNION ALL方案,性能可提升3-10倍(TPC-DS基准测试)。
SELECT
column1,
column2,
SUM(metric)
FROM table
GROUP BY GROUPING SETS (
(column1), -- 维度1单独分组
(column2), -- 维度2单独分组
(column1, column2), -- 维度组合
() -- 总计行
)
SELECT
COALESCE(time_period, '总计') AS time,
COALESCE(category, '全品类') AS category,
SUM(sales) AS total_sales
FROM sales_data
GROUP BY GROUPING SETS (
(time_period, category), -- 各时段各品类
(time_period), -- 各时段汇总
(category), -- 各品类汇总
() -- 全局总计
)
ORDER BY time NULLS LAST, category NULLS LAST;
time | category | total_sales
2023-Q1 | 手机 | 1200000
2023-Q1 | 电脑 | 980000
2023-Q1 | 全品类 | 2180000 -- 时段小计
全时段 | 手机 | 4500000 -- 品类汇总
全时段 | 电脑 | 3200000
总计 | 全品类 | 7700000 -- 全局总计
SELECT
app_type,
region,
COUNT(DISTINCT user_id) AS uv,
SUM(data_usage) / 1024 AS data_usage_gb
FROM network_logs
GROUP BY GROUPING SETS (
(app_type, region), -- 应用+地区组合
(app_type), -- 应用维度汇总
(region) -- 地区维度汇总
)
SELECT
CASE GROUPING(department)
WHEN 1 THEN '所有部门'
ELSE department END AS dept,
CASE GROUPING(job_role)
WHEN 1 THEN '全部职位'
ELSE job_role END AS role,
AVG(salary) AS avg_salary
FROM employee
GROUP BY GROUPING SETS (
(department, job_role),
(department),
(job_role)
)
-- 生成国家-省份-城市三级统计
GROUPING SETS (
(country, province, city),
(country, province),
(country),
()
)
错误写法:
SELECT
SUM(amount)/COUNT(*) AS avg_amount -- 错误!COUNT(*)包含空分组
FROM orders
GROUP BY GROUPING SETS ((region), ())
正确方案:
SELECT
SUM(amount) / NULLIF(COUNT(region), 0) AS avg_amount
ORDER BY
GROUPING(department) ASC, -- 汇总行置后
department NULLS LAST
SELECT
COALESCE(region, '全国') AS region,
CASE WHEN GROUPING(month) = 1 THEN '年度汇总'
ELSE TO_CHAR(month, 'YYYY-MM') END AS month
。