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。
任何帮助,将不胜感激。我相信我应该使用枢轴或最大函数,但不知道如何去做。
这称为条件聚合:
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)