2017-02-09 5 views
0

Это популярный вопрос, который я знаю. Я просто узнаю о сводных таблицах и не знаю, где я ошибаюсь.SQL Server Pivot Table, Null Результаты

create table #test 
(
    id varchar(4), 
    code varchar(2), 
    received_dt varchar(8) 
) 

insert into #test values ('1234','10','20150312') 
insert into #test values ('1234','71','20150312') 
insert into #test values ('1234','C5','20150312') 
insert into #test values ('4321','10','20150312') 
insert into #test values ('4321','71','20150312') 
insert into #test values ('987','10','20150312') 
insert into #test values ('987','71','20150312') 
insert into #test values ('987','C5','20150312') 

select id, [code1], [code2], [code3] 
from #test 
pivot(MAX(code) for code in ([code1], [code2], [code3])) as pvt 

drop table #test 

Любая помощь/руководство очень ценится. Я знаю, что это должно быть легко, но я не могу обернуть вокруг себя мозг.

Результаты в:

ID  Code1 Code2 Code3 
1234 NULL NULL NULL 
4321 NULL NULL NULL 
987  NULL NULL NULL 

Хочет:

ID  Code1 Code2 Code3 
1234 10  71  C5 
4321 10  71  NULL 
987  10  71  C5 

EDIT Есть много значений кода.

+0

Вы должны действительно опубликовать результат, который хотите получить. – Lamak

+0

спасибо, что реализовано только после того, как я опубликовал. – GibralterTop

ответ

3

Вам нужно создать еще один столбец, который содержит Code1, Code2, Code3 значения:

;WITH CTE AS 
(
    SELECT *, 
      RN = 'Code' + 
       CAST(ROW_NUMBER() OVER(PARTITION BY ID ORDER BY code) AS CHAR(1)) 
    FROM #test 
) 
SELECT id, [code1], [code2], [code3] 
FROM CTE 
PIVOT(MAX(code) for RN in ([code1], [code2], [code3])) as pvt; 

UPDATE

Если у Вас есть неизвестное количество кодов, вы будете нуждаться в динамический SQL:

DECLARE @sql NVARCHAR(MAX) = N'', @cols NVARCHAR(MAX) = N''; 

WITH CTE AS 
(
    SELECT *, 
      RN = 'Code' + 
       CAST(ROW_NUMBER() OVER(PARTITION BY ID ORDER BY code) AS CHAR(1)) 
    FROM #test 
) 
SELECT @cols += STUFF((SELECT ',' + QUOTENAME(RN) 
         FROM CTE 
         GROUP BY RN 
         FOR XML PATH('')), 1, 1, ''); 


SET @sql = N' 
SELECT * 
FROM ( SELECT *, 
       RN = ''Code'' + 
       CAST(ROW_NUMBER() OVER(PARTITION BY ID ORDER BY code) AS CHAR(1)) 
    FROM #test) AS d 
PIVOT(MAX(code) for RN in (' + @cols + ')) AS p;'; 

EXEC sp_executesql @sql; 
+0

Динамическая часть - вот что сделал трюк для меня. Спасибо огромное! – GibralterTop