SQL行转列需求:将任务成本数据转换为按地块展示的结构
SQL行转列解决方案:将Task字段转为列展示Cost数据
原表结构
| Plots | Task | Cost |
|---|---|---|
| Plot 1 | Lift 1 | 230.00 |
| Plot 1 | Lift 2 | 300.00 |
| Plot 2 | Lift 1 | 400.00 |
| Plot 2 | Lift 2 | 345.00 |
| Plot 3 | Lift 1 | 445.78 |
| Plot 3 | Lift 2 | 555.00 |
目标表结构
| Plots | Lift 1 | Lift 2 |
|---|---|---|
| Plot 1 | 230.00 | 300.00 |
| Plot 2 | 400.00 | 345.00 |
| Plot 3 | 445.78 | 555.00 |
解决方案
方法1:条件聚合(兼容多数数据库,如MySQL、PostgreSQL、SQL Server等)
这是通用度最高的方案,新手易理解。通过GROUP BY按Plots分组,结合CASE WHEN提取对应Task的Cost值:
SELECT Plots, MAX(CASE WHEN Task = 'Lift 1' THEN Cost END) AS `Lift 1`, MAX(CASE WHEN Task = 'Lift 2' THEN Cost END) AS `Lift 2` FROM 你的表名 GROUP BY Plots;
说明:
CASE WHEN匹配指定Task,返回对应Cost,非匹配项返回NULL- 用
MAX()聚合NULL值(因每个Plots+Task组合唯一,MIN()也可),保留有效Cost - 替换
你的表名为实际表名
方法2:PIVOT函数(适用于SQL Server、Oracle等支持该语法的数据库)
如果你的数据库支持PIVOT语法,可使用更简洁的写法:
SELECT Plots, [Lift 1], [Lift 2] FROM 你的表名 PIVOT ( MAX(Cost) FOR Task IN ([Lift 1], [Lift 2]) ) AS PivotTable;
说明:
PIVOT指定聚合函数(这里用MAX,因分组唯一),将Task的取值转为列名FOR Task IN中列出需要转为列的Task值- 替换
你的表名为实际表名
内容的提问来源于stack exchange,提问作者NickC1978
相关产品推荐
相关产品推荐

