Maaf jika pertanyaan ini membingungkan, tetapi saya tidak yakin bagaimana lagi mengatakannya. Saat ini saya sedang mengerjakan kueri di mana saya memiliki daftar pasien di fasilitas medis yang memiliki kode diagnosis tertentu. Ini adalah kueri yang cukup mendasar:

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

Kueri itu sendiri berfungsi dengan baik, tetapi ada sejumlah pasien yang memiliki banyak kode dari klausa WHERE yang dilampirkan ke bagan mereka, dan setiap kode berakhir di baris baru, jadi saya mendapatkan beberapa hasil untuk setiap pasien, dengan kode sebagai hanya perbedaannya, seperti:

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

Saya dapat bekerja dengan ini dengan cukup mudah, tetapi saya ingin tahu apakah ada cara yang memungkinkan untuk mengkodekan kueri ini sehingga kolom baru dibuat untuk setiap catatan individu untuk pasien tertentu, sehingga menampilkan hasil seperti ini:

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

Masalahnya adalah saya tidak memiliki cara untuk mengetahui pada awalnya berapa banyak hasil yang akan diperoleh pasien tertentu. Ini tampaknya seperti kebanyakan orang hanya memiliki 2 atau 3, tetapi secara teori, seorang pasien dapat memiliki setiap kode diagnosis yang termasuk dalam klausa WHERE saya. Dalam hal ini, itu akan menjadi BANYAK kolom yang ditambahkan, tetapi saya perlu SQL Server untuk melihat berapa banyak hasil yang ada untuk pasien itu dan menambahkan kolom tersebut, jika itu masuk akal.

Bagaimanapun, ini lebih merupakan pertanyaan keingintahuan daripada pertanyaan saya-perlu-ini-dijawab-untuk-bahkan-melakukan-pekerjaan saya. Apakah hal seperti ini mungkin terjadi?

3
EJF 19 September 2019, 20:04

1 menjawab

Jawaban Terbaik

Anda perlu melakukan PIVOT dinamis tetapi juga untuk membuat nama kolom. Sesuatu seperti ini:

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

1
gotqn 19 September 2019, 17:44