如何在SQL中透视指定列并同时重命名列(患者数据场景)
实现SQL数据透视:将多记录患者数据转为宽表
这里提供两种符合需求的实现方案,对应你提到的MAX函数和PIVOT语法方向:
方法一:条件聚合(逻辑直观,推荐固定列场景)
通过分组+条件判断实现列转换,灵活性高:
SELECT PTID, clmid, clmfrom, MAX(CASE WHEN CriteriaID = '41' THEN Code END) AS SysCode, MAX(CASE WHEN CriteriaID = '42' THEN Code END) AS DiaCode FROM #df GROUP BY PTID, clmid, clmfrom ORDER BY PTID;
逻辑说明
- 按
PTID、clmid、clmfrom分组,确保同一患者同一次理赔的记录合并为一行 - 用
CASE匹配CriteriaID提取对应Code,无匹配时自动返回NULL MAX用于聚合:每组内同一CriteriaID仅对应一个Code,MAX可精准提取该值,同时忽略NULL
方法二:使用PIVOT语法
如果习惯SQL原生透视语法,可通过PIVOT实现,需注意列名重命名:
SELECT PTID, clmid, clmfrom, [41] AS SysCode, [42] AS DiaCode FROM #df PIVOT ( MAX(Code) FOR CriteriaID IN ([41], [42]) ) AS PivotTable ORDER BY PTID;
逻辑说明
PIVOT子句中,MAX(Code)指定聚合字段,FOR CriteriaID IN ([41], [42])定义要透视的列值- 透视后生成的列名为
[41]和[42],通过别名直接重命名为SysCode和DiaCode - 依赖
MAX聚合确保每组仅返回一个有效Code值
两种方法均可生成你需要的#finaldf结构数据,测试结果完全符合预期。
内容的提问来源于stack exchange,提问作者Trevor M
相关产品推荐
相关产品推荐

