2017-02-09 4 views
0

Dies ist eine beliebte Frage, die ich kenne. Ich lerne gerade über Pivot-Tabellen und weiß nicht, wo ich falsch liege.SQL Server-Pivot-Tabelle, Null-Ergebnisse

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 

Jede Hilfe/Anleitung wird sehr geschätzt. Ich weiß, das sollte einfach sein, aber ich kann mich nicht darum kümmern.

Ergebnisse in:

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

Want:

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

EDIT gibt es viele Codewerte.

+0

sollten Sie wirklich das Ergebnis, dass Sie – Lamak

+0

erhalten möchten, danke erst nach der Veröffentlichung veröffentlicht. – GibralterTop

Antwort

3

Sie werden eine weitere Spalte erstellen müssen, die Code1, Code2, Code3 Werte enthält:

;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

Wenn Sie eine unbekannte Anzahl von Codes haben, müssen Sie die dynamische 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

Der dynamische Teil war der Trick für mich. Ich danke dir sehr! – GibralterTop