SQL数据透视表1:将M行转换为字符串列

SQL数据透视表1:将M行转换为字符串列

问题描述:

我有一个1:M记录集,我需要将其转换为结果连接的列。SQL数据透视表1:将M行转换为字符串列

创建示例数据:

CREATE TABLE #temptable 
(
    ID int, 
    Division int, 
    Material int 
); 

insert into #temptable 
Values 
(999, 1, 1) 
,(999, 1, 2) 
,(999, 1, 3) 
,(999, 2, 1) 
,(999, 2, 6) 
,(999, 3, 2) 

的样本数据:

ID  Division  Material 
---- ---------- ---------- 
999  1   1   
999  1   2 
999  1   3 
999  2   1 
999  2   6 
999  3   2 

我需要的结果是这样的,其中每个部门的材料连接在一起:

ID Division-1 Division-2 Division-3 
---- ---------- ---------- ---------- 
999  1,2,3   1,6   2 
+3

你尝试过什么吗? –

+0

什么版本的SQL? – Shawn

+0

Kamran在下面的答案解决了这个问题。 – ScottM

试试这个:

SELECT ID, 
     [1] AS 'Division-1', 
     [2] AS 'Division-2', 
     [3] AS 'Division-3' 
FROM 
(
    SELECT DISTINCT 
      a.ID, 
      a.Division, 
      LEFT(r.ResourceName, LEN(r.ResourceName) - 1) ResourceName 
    FROM #temptable a 
     CROSS APPLY 
    (
     SELECT CAST(Material AS VARCHAR(10))+',' 
     FROM #temptable t 
     WHERE a.[ID] = t.[ID] 
       AND a.Division = t.Division 
     FOR XML PATH('') 
    ) r(ResourceName) 
) src PIVOT(MAX(ResourceName) FOR Division IN([1], 
               [2], 
               [3])) piv; 

简要解释 我们需要通过逗号分隔的结构创建支点。

下面的查询将列值转换为以逗号分隔的行。

SELECT a.ID, 
     a.Division, 
     LEFT(r.ResourceName, LEN(r.ResourceName) - 1) ResourceName 
FROM #temptable a 
    CROSS APPLY 
(
    SELECT CAST(Material AS VARCHAR(10))+',' 
    FROM #temptable t 
    WHERE a.[ID] = t.[ID] 
      AND a.Division = t.Division 
    FOR XML PATH('') 
) r(ResourceName); 

之后,我们创建了关键点。

+0

这非常出色,超越了我的功夫水平。非常感谢你。 – ScottM

+0

@ScottM:如果有帮助,将其标记为答案,以防人们偶然发现 –