将相同ID的行拆分为列

3

我有一个表格,长这样:

ID    Name
1     John
1     Maria
1     Sam
2     Lisa
2     Martin

我希望能够得到这样的输出结果:
ID    NAME1    NAME2    NAME3
1     John     Maria    Sam  
2     Lisa     Martin   NULL  

我不想使用pivot函数,因为它不会给我这个结果(当我尝试时)。

ID只会生成3行具有相同id编号的名称列。

完成此查询的SP:

INSERT INTO [Database].[dbo].[TEST]
(
       [ID],
       [Contact1],
       [Contact2],
       [Contact3]
)

;WITH CTE
AS 
(
SELECT 
    ID,
    NAMN,
    ROW_NUMBER() OVER(PARTITION BY P_ID ORDER BY NAMN) AS RowNum
FROM tabl1 
WHERE VISA_EJ = 0
)
SELECT 
    [ID],
    [1] AS [Contact1],
    [2] AS [Contact2],
    [3] AS [Contact3]
FROM CTE
PIVOT(MAX(NAMN) for RowNum in ([1],[2],[3])) AS [Contacts]

仍然出现分号错误。
2个回答

3
这个现在可以使用:
WITH ot AS (
 SELECT ID, Name, 
     ROW_NUMBER() OVER (Partition BY ID ORDER BY Name) n
 FROM tbl )
SELECT a.id id, a.Name name1,b.Name name2, c.Name name3 
FROM ot a 
LEFT JOIN ot b ON b.id=a.id AND b.n=2
LEFT JOIN ot c ON c.id=b.id AND c.n=3
WHERE a.n=1
ORDER BY id

请查看这里:http://sqlfiddle.com/#!6/2f850/1

如果存在,此处将仅显示name2和name3两列的内容。


3
您可以使用窗口函数和透视表的组合:

您可以使用窗口函数和透视表的组合:

;with cte as(select id,
                    name, 
                    row_number() over(partition by id order by name) as rn
             from table_name)
 select id,
        [1] as name1,
        [2] as name2,
        [3] as name3
 from cte
 pivot(max(name) for rn in([1],[2],[3]))p

另外,您也可以使用子查询来执行相同的操作:

 select id,
        [1] as name1,
        [2] as name2,
        [3] as name3
 from (select id,
              name, 
              row_number() over(partition by id order by name) as rn
       from table_name) cte
 pivot(max(name) for rn in([1],[2],[3]))p

编辑:

;WITH CTE
AS 
(
SELECT 
    ID,
    NAMN,
    ROW_NUMBER() OVER(PARTITION BY P_ID ORDER BY NAMN) AS RowNum
FROM tabl1 
WHERE VISA_EJ = 0
)

INSERT INTO [Database].[dbo].[TEST]
(
       [ID],
       [Contact1],
       [Contact2],
       [Contact3]
)

SELECT 
    [ID],
    [1] AS [Contact1],
    [2] AS [Contact2],
    [3] AS [Contact3]
FROM CTE
PIVOT(MAX(NAMN) for RowNum in ([1],[2],[3])) AS [Contacts]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接