SQL Server: How can I group multiple row values into separate columns?

前端 未结 1 1611

I am attempting to create a SELECT query that will allow me to combine multiple phone numbers for a Contact into separate columns.

For example, I would

1条回答
  •  离开以前
    2020-12-12 01:53

    Here is a dynamic pivot way:

    declare @table table (Email varchar(64), Phone varchar(16), ID varchar(3))
    insert into @table
    values
    
    ('x@x.com','555-5555','001'),
    ('x@x.com','555-5556','001'),
    ('x@x.com','555-5557','001'),
    ('x@x.com','555-5558','001'),
    ('x@xdd.com','333-5556','002'),
    ('x@xdd.com','444-5556','002'),
    ('x@xdd.com','777-5556','002')
    
    
    select
        Email
        ,Phone
        ,ID
        ,row_number() over (partition by ID order by Phone) as RN
    into #staging
    from 
        @table
    
    
    
    
    DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
    DECLARE @ColumnName AS NVARCHAR(MAX)
    
    --Get distinct values of the PIVOT Column 
    SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
           + QUOTENAME(RN)
    FROM (SELECT DISTINCT RN FROM #staging) AS RN
    
    --Prepare the PIVOT query using the dynamic 
    SET @DynamicPivotQuery = 
      N'SELECT Email, ID, ' + @ColumnName + '
        FROM #staging
        PIVOT(MAX(Phone) 
              FOR RN IN (' + @ColumnName + ')) AS PVTTable'
    --Execute the Dynamic Pivot Query
    EXEC sp_executesql @DynamicPivotQuery
    
    drop table #staging
    

    If you are only expecting 3, as you stated, you can skip the dynamic...

    declare @table table (Email varchar(64), Phone varchar(16), ID varchar(3))
    insert into @table
    values
    
    ('x@x.com','555-5555','001'),
    ('x@x.com','555-5556','001'),
    ('x@xdd.com','333-5556','002'),
    ('x@xdd.com','444-5556','002'),
    ('x@xdd.com','777-5556','002')
    
    ;with cte as(
    select
        Email
        ,Phone
        ,ID
        ,row_number() over (partition by ID order by Phone) as RN
    from 
        @table)
    
    select
        Email
        ,max(case when RN = 1 then Phone end) as Phone1
        ,max(case when RN = 2 then Phone end) as Phone2
        ,max(case when RN = 3 then Phone end) as Phone3
        ,ID
    from
        cte
    group by
        Email
        ,ID
    

    0 讨论(0)
提交回复
热议问题