如何使用SQL实现steps表行转列,将行数据转换为新表对应列
SQL行转列实现方案
通用兼容写法(支持MySQL、PostgreSQL、SQL Server、Oracle等所有主流数据库)
使用CASE WHEN条件判断 + 聚合函数的方式实现,兼容性最强:
SELECT ID, MAX(CASE WHEN Steps = 'Create' THEN Steps_Date END) AS `Create`, MAX(CASE WHEN Steps = 'Request' THEN Steps_Date END) AS `Request`, MAX(CASE WHEN Steps = 'Schedule' THEN Steps_Date END) AS `Schedule`, MAX(CASE WHEN Steps = 'Complete' THEN Steps_Date END) AS `Complete` FROM steps GROUP BY ID;
原理说明:按ID分组后,CASE WHEN会匹配对应步骤的日期,不匹配的返回NULL,再通过MAX聚合函数取出每个步骤唯一的非NULL日期值,完全符合预期输出要求。
如果使用MySQL数据库,还可以用IF函数简化写法:
SELECT ID, MAX(IF(Steps = 'Create', Steps_Date, NULL)) AS `Create`, MAX(IF(Steps = 'Request', Steps_Date, NULL)) AS `Request`, MAX(IF(Steps = 'Schedule', Steps_Date, NULL)) AS `Schedule`, MAX(IF(Steps = 'Complete', Steps_Date, NULL)) AS `Complete` FROM steps GROUP BY ID;
特定数据库PIVOT语法实现
SQL Server、Oracle、PostgreSQL 11及以上版本支持原生PIVOT行转列语法,写法更简洁,以SQL Server为例:
SELECT * FROM steps PIVOT ( MAX(Steps_Date) FOR Steps IN ([Create], [Request], [Schedule], [Complete]) ) AS pivot_result;
注意事项
以上写法仅适用于Steps字段的取值固定为Create、Request、Schedule、Complete的场景。如果Steps的取值是动态变化的,需要编写动态SQL拼接查询语句实现。
内容的提问来源于stack exchange,提问作者Drewtheman
相关产品推荐
相关产品推荐

