SQL Server将数据透视到未知列数

时间:2017-05-19 06:33:32

标签: 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的数量会有所不同。我认为pivot是我需要使用的,但我不太了解SQL知道其他问题的答案对我有用,或者甚至可能。

1 个答案:

答案 0 :(得分: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 ('+@columns+')
) AS pvt'

EXECUTE sp_executesql @query

<强>结果:

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