Snowflake SQL:基于单列值将多行数据转换为多列展示
行转列实现方案
基于你提供的虚拟表结构,以下是几种主流数据库的可行解决方案,核心是利用RowNum作为标识将行数据转为列:
1. MySQL/MariaDB 写法
通过条件聚合实现,适合没有内置行转列函数的数据库:
SELECT PatientID, MAX(CASE WHEN RowNum = 1 THEN ProcedureCode END) AS Procedure1, MAX(CASE WHEN RowNum = 2 THEN ProcedureCode END) AS Procedure2, MAX(CASE WHEN RowNum = 3 THEN ProcedureCode END) AS Procedure3, MAX(CASE WHEN RowNum = 4 THEN ProcedureCode END) AS Procedure4 FROM 你的虚拟表名称 -- 替换成你实际的虚拟表名 GROUP BY PatientID, ProcedureDate -- 按患者ID和手术日期分组,确保同一日期的操作合并
2. SQL Server 写法
可以用内置的PIVOT函数,代码更简洁:
SELECT PatientID, [1] AS Procedure1, [2] AS Procedure2, [3] AS Procedure3, [4] AS Procedure4 FROM 你的虚拟表名称 PIVOT ( MAX(ProcedureCode) -- 聚合取值,因为同一RowNum下唯一 FOR RowNum IN ([1], [2], [3], [4]) -- 指定要转成列的RowNum值 ) AS PivotResult GROUP BY PatientID, ProcedureDate, [1], [2], [3], [4]
3. Oracle 写法
同样支持PIVOT函数,也可以用条件聚合:
用PIVOT的写法
SELECT PatientID, Procedure1, Procedure2, Procedure3, Procedure4 FROM 你的虚拟表名称 PIVOT ( MAX(ProcedureCode) FOR RowNum IN (1 AS Procedure1, 2 AS Procedure2, 3 AS Procedure3, 4 AS Procedure4) ) GROUP BY PatientID, ProcedureDate, Procedure1, Procedure2, Procedure3, Procedure4
条件聚合写法(和MySQL一致)
SELECT PatientID, MAX(CASE WHEN RowNum = 1 THEN ProcedureCode END) AS Procedure1, MAX(CASE WHEN RowNum = 2 THEN ProcedureCode END) AS Procedure2, MAX(CASE WHEN RowNum = 3 THEN ProcedureCode END) AS Procedure3, MAX(CASE WHEN RowNum = 4 THEN ProcedureCode END) AS Procedure4 FROM 你的虚拟表名称 GROUP BY PatientID, ProcedureDate
补充说明
如果患者的手术操作数量不固定(比如有的超过4个),需要动态生成列的话,需要用对应数据库的动态SQL实现(比如MySQL的存储过程、SQL Server的动态拼接语句)。如果是固定最多4个操作,上面的静态写法完全满足需求。
内容的提问来源于stack exchange,提问作者Talay
相关产品推荐
相关产品推荐

