如何编写SELECT语句实现列转行:拆分利润列为类型与利润字段
SQL行转列:将宽表转换为纵向结构
原始表结构与数据
假设表名为shop_profits,数据如下:
+------+--------------+--------------+ | SHOP | BUY_PROFIT | SELL_PROFIT | +------+--------------+--------------+ | A | 10 | 15 | +------+--------------+--------------+
目标结果集
需要转换为以下纵向结构:
+------+------+--------+ | SHOP | TYPE | PROFIT | +------+------+--------+ | A | BUY | 10 | | A | SELL | 15 | +------+------+--------+
解决方案
方法1:通用UNION ALL写法(所有SQL数据库支持)
通过两次查询分别提取BUY_PROFIT和SELL_PROFIT字段,再合并结果:
SELECT SHOP, 'BUY' AS TYPE, BUY_PROFIT AS PROFIT FROM shop_profits UNION ALL SELECT SHOP, 'SELL' AS TYPE, SELL_PROFIT AS PROFIT FROM shop_profits;
- 选用
UNION ALL而非UNION,因为不会产生重复行,执行性能更优。
方法2:使用UNPIVOT语法(适用于SQL Server、Oracle等支持的数据库)
如果你的数据库支持UNPIVOT操作,可以用更简洁的语法实现:
SELECT SHOP, TYPE, PROFIT FROM shop_profits UNPIVOT ( PROFIT FOR TYPE IN (BUY_PROFIT AS 'BUY', SELL_PROFIT AS 'SELL') ) AS unpvt;
UNPIVOT会自动将指定的横向列转换为纵向行,同时映射TYPE字段的对应值。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

