2017-05-19 69 views
3

的我看起來像這樣的數據:SQL Server的數據透視未知數量的列

id | serialNo 
0245DS6 | 05813542 
0245DS6 | 05813543 
0245DS6 | 05813544 
2231VC7 | 06885213 
5432PS1 | 01325131 
5432PS1 | 01325132 

,我需要它輸出這樣的:

id | serial_1 | serial_2 | serial_3 | ... 
    0245DS6 | 05813542 | 05813543 | 05813544 | ... 
    2231VC7 | 06885213 |   |   | 
    5432PS1 | 01325131 | 01325132 |   | 

我不知道有多少串每個ID的數字(很可能不會大於10),並且每個ID的數字都不相同。我認爲數據透視是我需要使用的,但我對SQL知之甚少,無法知道其他問題的答案對我有用,或者甚至可能。

+2

你需要爲這個動態SQL。 –

回答

3

我只是開始說這將是有趣的(有點邪惡)。

表結構:

CREATE TABLE #temp 
(
    id VARCHAR(100), 
    serialNo VARCHAR(100) 
); 

測試數據

INSERT INTO #temp 
VALUES 
('0245DS6','05813542'), 
('0245DS6','05813543'), 
('0245DS6','05813544'), 
('2231VC7','06885213'), 
('5432PS1','01325131'), 
('5432PS1','01325132') 

然後得到獨特的羣體:

DECLARE @columns VARCHAR(MAX)= 
(
    STUFF(
    (
    Select ','+QUOTENAME(CAST(rowId AS VARCHAR(100))) AS [text()] 
    FROM 
    (
     SELECT DISTINCT 
      ROW_NUMBER() OVER(PARTITION BY id order by serialNo) AS rowId 
     FROM #temp 
    ) as tbl 
    For XML PATH ('') 
    ) 
    ,1,1,'') 
) 

然後執行動態透視:

DECLARE @query NVARCHAR(MAX)='SELECT 
    * 
FROM 
(
    SELECT 
     ROW_NUMBER() OVER(PARTITION BY id order by serialNo) as rowId, 
     id, 
     serialNo 
    FROM 
     #temp 
)AS sourceTable 
PIVOT 
(
    MAX(serialNo) 
    FOR rowId IN ('[email protected]+') 
) AS pvt' 

EXECUTE sp_executesql @query 

結果:

Id  1   2   3 
------------------------------------------- 
0245DS6 05813542 05813543 05813544 
2231VC7 06885213 NULL  NULL 
5432PS1 01325131 01325132 NULL 
+0

太棒了,那有效。非常感謝! – Riverchimp