将具有相同 ID 的行拆分为列

Split rows with same ID into columns

我有一个 table 看起来像这样:

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 只会生成具有相同 id nr 的 3 行,因此只有 3 个名称列。

完成此查询的 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]

仍然出现分号错误。

这个现在有效:

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 存在时显示它们。

您可以结合使用 window 函数和旋转:

;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]