贝利信息

SQL 如何实现行转列(Pivot)?

日期:2026-01-19 00:00 / 作者:舞夢輝影
SQL行转列核心是将离散值作新列名并旋转数据,通用写法为CASE WHEN+GROUP BY聚合,SQL Server/Oracle支持PIVOT关键字,MySQL需用CASE WHEN模拟,动态列需应用层处理。

SQL 行转列(Pivot)的核心是把某一列的**离散值**作为新列名,将对应的数据“旋转”过去。不同数据库语法差异较大,但思路一致:先聚合(避免多行冲突),再按条件分组展开。

标准 SQL(通用写法:CASE WHEN + GROUP BY)

这是兼容性最强的方式,适用于 MySQL、PostgreSQL、SQL Server、Oracle 等所有主流数据库。

示例:将订单表中按商品类别的销售额转为横向列

SELECT 
  order_date,
  MAX(CASE WHEN category = '电子' THEN amount END) AS 电子,
  MAX(CASE WHEN category = '服装' THEN amount END) AS 服装,
  MAX(CASE WHEN category = '食品' THEN amount END) AS 食品
FROM orders
GROUP BY order_date;

SQL Server / Oracle:使用内置 PIVOT 关键字

语法更简洁,但要求明确指定列名,且不支持动态列(列名需写死)。

SELECT order_date, [电子], [服装], [食品]
FROM (
  SELECT order_date, category, amount FROM orders
) AS src
P

IVOT ( SUM(amount) FOR category IN ([电子], [服装], [食品]) ) AS pvt;

MySQL 8.0+:窗口函数辅助 + GROUP BY(无原生 PIVOT)

MySQL 没有 PIVOT 关键字,仍推荐 CASE WHEN 方式。若需动态列(比如类别不固定),必须靠应用层拼接 SQL 或用存储过程模拟。

注意事项与常见坑

行转列不是“魔法”,本质是分组聚合后的结构重排,容易出错的点包括: