2017-05-19 40 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