2017-02-09 36 views
0

這是我知道的一個受歡迎的問題。我只是瞭解數據透視表,不知道我哪裏出錯。SQL Server數據透視表,空值結果

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 

編輯有很多代碼值。

+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