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

如何将含多诊断码的行逆透视并获取DX_Order列?

解决UNPIVOT转换时添加DX_Order字段的问题

你已经用UNPIVOT完成了宽表转窄表的核心操作,现在只需要小改动就能加上对应的诊断码序号,这里有两种实用方法可以实现:

方法一:基于现有UNPIVOT查询快速添加序号

UNPIVOT生成的DXs字段其实就是原表的列名(比如DX01、DX02),我们可以直接从这个列名里提取数字部分作为DX_Order:

SELECT 
    ID, 
    Name,
    CAST(RIGHT(DXs, 2) AS INT) AS DX_Order, -- 从列名提取序号,自动去掉前导零
    DX
FROM (
 SELECT ID, Name, DX01, DX02, DX03, ..., DX25
 FROM dbo.Table
 ) AS cp
UNPIVOT (
 DX FOR DXs IN (DX01, DX02, DX03, ...., DX25)
 ) AS up;

注:因为你的列名是DX01到DX25的规则,RIGHT(DXs,2)能精准提取末尾两位数字,转成INT后就得到1、2这类序号。而且你提到的UNPIVOT自动忽略NULL值的特性完全生效,不需要额外加过滤条件。

方法二:用CROSS APPLY + VALUES实现更直观的逆透视

如果觉得处理字符串不够稳妥,也可以用CROSS APPLY配合VALUES子句手动关联每个诊断码列和对应的序号,这种写法更清晰,后续维护也更方便:

SELECT 
    ID, 
    Name,
    DX_Order,
    DX
FROM dbo.Table
CROSS APPLY (
    VALUES
        (1, DX01),
        (2, DX02),
        (3, DX03),
        -- ... 依次补充到(25, DX25)
        (25, DX25)
) AS ca(DX_Order, DX)
WHERE DX IS NOT NULL; -- 手动过滤NULL值

这种方法不依赖列名的命名规则,直接指定序号和对应列的映射,哪怕后续列名有调整,修改起来也更灵活。

内容的提问来源于stack exchange,提问作者shockwave

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:59:30