SQL: создать новые столбцы для записей с несколькими результатами? - PullRequest
3 голосов
/ 19 сентября 2019

Извините, если этот вопрос сбивает с толку, но я не был уверен, как еще это сформулировать.В настоящее время я работаю над запросом, где у меня есть список пациентов в медицинском учреждении, у которых есть определенные коды диагноза.Это довольно простой запрос:

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, чтобы просто посмотреть, сколько результатов было для этого пациента, и добавить эти столбцы соответствующим образом, если это имеет смысл.

В любом случае,это больше вопрос любопытства, чем вопрос «мне нужно это ответили в порядке, чтобы даже сделать мою работу».Будет ли что-то подобное вообще возможным?

1 Ответ

1 голос
/ 19 сентября 2019

Вам необходимо выполнить динамическое 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...