You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:03:26