CREATE table #source (Patient_ID varchar(100), Event_ID varchar (100) ,Diagnosis_Code VARCHAR(100),Dig_Number INT)
insert into #source (Patient_ID, Event_ID,Diagnosis_Code,Dig_Number) values
('Pers001','HospStay001','I245',2),
('Pers001','HospStay001','D456',3),
('Pers001','HospStay002','C139',1),
('Pers001','HospStay002','J123',2),
('Pers555','HospStay001','D312',1),
('Pers999','HospStay001','C120',1),
('Pers999','HospStay001','E101',2),
('Pers001','HospStay001','C139',1)
--DROP TABLE tempdb..#source
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SELECT @cols = STUFF
(
(
SELECT ',' + QUOTENAME( CONVERT(VARCHAR(10),Dig_Number))
FROM #source
GROUP BY Dig_Number
ORDER BY Dig_Number
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'),
1,1,''
);
SET @query = 'SELECT Patient_ID,Event_ID,' + @cols + '
FROM
(
SELECT Patient_ID,Event_ID,Diagnosis_Code,dig_number
FROM #source
) x
PIVOT
(
MAX(Diagnosis_Code)
FOR Dig_Number IN (' + @cols + ')
) p ';
EXECUTE(@query);
будет работать, если увеличить еще один столбец, который является числом дианоза.