如何同时旋转某些列并重命名列

Tre*_*r M 0 sql sql-server pivot

我有下表,其中包含患者的数据。如果每个患者有超过 1 个与其 ID 相关的代码,则可以多次就诊。该代码还与使用 CriteriaID 列传送的代码组相关联。

DROP TABLE IF EXISTS #df

CREATE TABLE #df 
(
    PTID VARCHAR(10),
    clmid VARCHAR(5),
    clmfrom date,
    Code VARCHAR(5),
    CriteriaID VARCHAR(5)
);

INSERT INTO #df (PTID, clmid, clmfrom, Code, CriteriaID)
VALUES
('X0001', '001', '2021-07-25', 'A1109', '41'),
('X0001', '001', '2021-07-25', 'B1192', '42'),
('X0002', '002', '2021-08-25', 'A1123', '41'),
('X0002', '002', '2021-08-25', 'B2231', '42'),
('X0003', '003', '2021-09-25', 'B2312', '42')

SELECT * FROM #df
Run Code Online (Sandbox Code Playgroud)

我希望我的最终表能够旋转代码并根据 CriteriaID 重命名列。

本质上,我希望我的决赛桌看起来像这样:

CREATE TABLE #finaldf 
(
    PTID VARCHAR(10),
    clmid VARCHAR(5),
    clmfrom date,
    SysCode VARCHAR(5),
    DiaCode VARCHAR(5),
);

INSERT INTO #finaldf (PTID, clmid, clmfrom, SysCode, DiaCode)
VALUES
('X0001', '001', '2021-07-25', 'A1109', 'B1192'),
('X0002', '002', '2021-08-25', 'A1123', 'B2231'),
('X0003', '003', '2021-09-25', NULL, 'B2312')

SELECT * FROM #finaldf
Run Code Online (Sandbox Code Playgroud)

如果与代码关联的 CriteriaID 在 #df 中为 41,那么我希望该列为 SysCode。如果与代码关联的 criteriaID 是 42,那么我希望该列是 DiaCode。如果 PTID 没有特定的 CriteriaID,则相应的 SysCode 或 DiaCode 列应为 NULL。

任何帮助,将不胜感激。我相信我应该使用枢轴或最大函数,但不知道如何去做。

Stu*_*Stu 6

这称为条件聚合:

select ptid, clmid, clmfrom,
    Max(case when CriteriaID = 41 then code end) SysCode,
    Max(case when CriteriaID = 42 then code end) DiaCode
from #df
group by ptid, clmid, clmfrom;
Run Code Online (Sandbox Code Playgroud)