【问题标题】:Split rows with same ID into columns将具有相同 ID 的行拆分为列
【发布时间】:2015-09-23 21:07:22
【问题描述】:

我有一张如下所示的表格:

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 nr,因此只有 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]

分号仍然出错。

【问题讨论】:

    标签: sql sql-server merge rows


    【解决方案1】:

    您可以结合使用窗口功能和旋转:

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

    【讨论】:

      【解决方案2】:

      这个现在可以工作了:

      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(如果它们存在)。

      【讨论】:

        猜你喜欢
        • 2015-01-13
        • 1970-01-01
        • 2020-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-16
        • 2019-05-10
        • 1970-01-01
        相关资源
        最近更新 更多