gpt4 book ai didi

SQL:为具有多个结果的记录创建新列?

转载 作者:行者123 更新时间:2023-12-01 13:54:25 26 4
gpt4 key购买 nike

如果这个问题令人困惑,我很抱歉,但我不确定该怎么表达。我目前正在处理一个查询,其中我有一份医疗机构中具有特定诊断代码的患者列表。这是一个非常基本的查询:

SELECT [several patient demographic fields]
FROM Diagnosis
WHERE DiagnosisCode IN (a bunch of diagnosis codes)

查询本身工作正常,但有许多患者的图表附加了 WHERE 子句中的多个代码,并且每个代码都在一个新行中结束,因此我为每个患者获得了多个结果,其中代码是唯一的区别,像这样:

PatientID    Name             DiagnosisCode
------------------------------------------------
1001 John Smith 123.0
1001 John Smith ABC.0
1002 Jane Doe 456.1
1003 Bob Brown 789.0
1003 Bob Brown DEF.1
1003 Bob Brown XYZ.0

我可以很容易地使用它,但我想知道是否有任何可能的方法来编写此查询,以便为给定患者的每个单独记录创建一个新列,从而显示如下结果:

PatientID    Name             DxCode1     DxCode2     DxCode3
--------------------------------------------------------------
1001 John Smith 123.0 ABC.0
1002 Jane Doe 456.1
1003 Bob Brown 789.0 DEF.1 XYZ.0

问题是我最初无法知道给定患者将获得多少结果。 看起来 大多数人只有 2 或 3 个,但理论上,患者可以将每个诊断代码包含在我的 WHERE 子句中。在那种情况下,会添加很多列,但我需要 SQL Server 只查看该患者有多少结果,并相应地添加这些列(如果有意义的话)。

无论如何,这更像是一个好奇心问题,而不是一个我需要这个答案才能完成我的工作的问题。这样的事情甚至可能吗?

最佳答案

您需要执行动态 PIVOT,还需要创建列名。像这样:

CREATE TABLE #DataSource
(
[PatientID] INT
,[Name] VARCHAR(12)
,[DiagnosisCode] VARCHAR(12)
,[ColumName] VARCHAR(12)
);

INSERT INTO #DataSource ([PatientID], [Name], [DiagnosisCode], [ColumName])
SELECT [PatientID]
,[Name]
,[DiagnosisCode]
,'DxCode' + CAST(DENSE_RANK() OVER (PARTITION BY [PatientID] ORDER BY [DiagnosisCode]) AS VARCHAR(6))
FROM
(
VALUES (1001, 'John Smith', '123.0')
,(1001, 'John Smith', 'ABC.0')
,(1002, 'Jane Doe', '456.1')
,(1003, 'Bob Brown', '789.0')
,(1003, 'Bob Brown', 'DEF.1')
,(1003, 'Bob Brown', 'XYZ.0')
) DS ([PatientID], [Name], [DiagnosisCode]);

DECLARE @DynammicTSQLStatement NVARCHAR(MAX)
,@DynamicPIVOTColumns NVARCHAR(MAX);

SET @DynamicPIVOTColumns = STUFF
(
(
SELECT ',' + QUOTENAME([ColumName])
FROM #DataSource
GROUP BY [ColumName]
ORDER BY [ColumName]
FOR XML PATH('') ,TYPE
).value('.', 'NVARCHAR(MAX)')
,1
,1
,''
);


SET @DynammicTSQLStatement = N'
SELECT *
FROM #DataSource DS
PIVOT
(
MAX([DiagnosisCode]) FOR [ColumName] IN (' + @DynamicPIVOTColumns + ')
) PVT';


EXEC sp_executesql @DynammicTSQLStatement

DROP TABLE #DataSource;

enter image description here

关于SQL:为具有多个结果的记录创建新列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58015862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com