PIVOT 行转列
PIVOT 将指定字段的取值转为输出列,并对匹配的数据进行聚合,适合按月份、地区等固定维度生成交叉汇总结果。
使用入口与语法
在工作簿或通过 JDBC、SQL 查询接口提交 SQL。使用前需具备输入表或视图的查询权限。
SELECT *
FROM <table_or_subquery>
PIVOT (
<aggregate_expression> [AS <measure_alias>]
FOR <pivot_column> IN (<value> [AS <column_alias>], ...)
[GROUP BY <group_column>, ...]
);
聚合表达式可以有多个。IN 列表明确指定需要展开的取值;需要按地区等保留多行时,在 PIVOT 内显式写 GROUP BY。未指定时按全局聚合处理,不会自动使用其他输入字段分组。
示例
输入数据包含地区、月份及金额:
SELECT *
FROM (VALUES
('east', 1, 10),
('east', 2, 20),
('west', 1, 30)
) AS sales(region, mth, amount)
PIVOT (
SUM(amount) AS total
FOR mth IN (1 AS jan, 2 AS feb)
GROUP BY region
);
按地区得到的结果如下,行顺序以实际查询为准:
| region | jan_total | feb_total |
|---|---|---|
| east | 10 | 20 |
| west | 30 | NULL |
删除 GROUP BY region 后,按全部输入汇总,输出 jan_total=40、feb_total=20,不再输出地区列。若同时使用 COUNT(*) AS n,则每个展开值还会产生对应的计数列。
结果验证与注意事项
- 用普通
GROUP BY或条件聚合核对结果,确认分组字段和展开值符合业务口径。 - 列名通常由展开值别名及聚合别名组成,引用时以实际输出为准;建议为展开值和聚合设置清晰且不重复的别名。
- 没有匹配值时,
SUM等可能返回NULL,COUNT返回 0,不应将空值统一当作零。 IN中的值是明确的输出列定义,不会根据数据自动增加新列;新增月份等取值时需更新 SQL。- 当前使用 AIR 的显式分组语义,不应直接套用其他数据库对隐式分组的理解。实际执行引擎及下推方式以执行计划为准。