SQL 中的数据透视将行转换为列,通常用于汇总或重组数据以进行报告。该过程涉及基于类别列聚合值并将它们显示为单独的列。虽然 SQL 没有通用的“PIVOT”关键字,但常见的方法包括使用带有 CASE
语句的条件聚合,或利用数据库特定的函数,如 SQL Server 中的 PIVOT
或 PostgreSQL 中的 crosstab
。
例如,考虑一个销售表,其中包含 year
、product
和 revenue
列。要透视数据以显示每个产品的收入作为每年的列,您可以使用条件聚合
SELECT
year,
SUM(CASE WHEN product = 'A' THEN revenue ELSE 0 END) AS product_A,
SUM(CASE WHEN product = 'B' THEN revenue ELSE 0 END) AS product_B
FROM sales
GROUP BY year;
此查询通过检查每行中的值并对收入求和来为每个产品创建一个列。 GROUP BY
确保结果按年份分组。此方法适用于大多数 SQL 方言,但对于许多类别来说会变得很麻烦,因为每个类别都需要单独的 CASE
语句。
在 SQL Server 中,PIVOT
运算符简化了此过程
SELECT year, [A] AS product_A, [B] AS product_B
FROM sales
PIVOT (SUM(revenue) FOR product IN ([A], [B])) AS pivoted;
这里,PIVOT
自动处理聚合和列创建。但是,您必须显式列出要透视到列中的值(例如,[A]
、[B]
)。这种方法更简洁,但如果类别随时间变化,则灵活性较差。 PostgreSQL 的 crosstab
函数提供类似的功能,但需要启用 tablefunc
扩展并使用特定的语法。
在透视时,如果事先不知道类别,请考虑使用动态 SQL。例如,使用存储过程或应用程序代码以编程方式生成列名。但是,动态透视可能会引入复杂性和安全风险(例如,SQL 注入)。始终验证输入并测试性能,因为透视大型数据集可能会消耗大量资源。尽可能使用数据库特定的工具,但为了跨数据库兼容性,请坚持使用条件聚合。