SQL行转列核心是将离散值作新列名并旋转数据,通用写法为CASE WHEN+GROUP BY聚合,SQL Server/Oracle支持PIVOT关键字,MySQL需用CASE WHEN模拟,动态列需应用层处理。
SQL 行转列(Pivot)的核心是把某一列的**离散值**作为新列名,将对应的数据“旋转”过去。不同数据库语法差异较大,但思路一致:先聚合(避免多行冲突),再按条件分组展开。
这是兼容性最强的方式,适用于 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;
语法更简洁,但要求明确指定列名,且不支持动态列(列名需写死)。
SELECT order_date, [电子], [服装], [食品] FROM ( SELECT order_date, category, amount FROM orders ) AS src PIVOT ( SUM(amount) FOR category IN ([电子], [服装], [食品]) ) AS pvt;
MySQL 没有 PIVOT 关键字,仍推荐 CASE WHEN 方式。若需动态列(比如类别不固定),必须靠应用层拼接 SQL 或用存储过程模拟。
行转列不是“魔法”,本质是分组聚合后的结构重排,容易出错的点包括: