跳转至

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 的显式分组语义,不应直接套用其他数据库对隐式分组的理解。实际执行引擎及下推方式以执行计划为准。