sql >> データベース >  >> RDS >> Sqlserver

SQL Server:複数の行の値を別々の列にグループ化するにはどうすればよいですか?

    動的なピボット方法は次のとおりです。

    declare @table table (Email varchar(64), Phone varchar(16), ID varchar(3))
    insert into @table
    values
    
    ('[email protected]','555-5555','001'),
    ('[email protected]','555-5556','001'),
    ('[email protected]','555-5557','001'),
    ('[email protected]','555-5558','001'),
    ('[email protected]','333-5556','002'),
    ('[email protected]','444-5556','002'),
    ('[email protected]','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
    

    3つしか期待していない場合は、前述のように、ダイナミックをスキップできます...

    declare @table table (Email varchar(64), Phone varchar(16), ID varchar(3))
    insert into @table
    values
    
    ('[email protected]','555-5555','001'),
    ('[email protected]','555-5556','001'),
    ('[email protected]','333-5556','002'),
    ('[email protected]','444-5556','002'),
    ('[email protected]','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
    



    1. PDO::ERRMODE_EXCEPTIONは警告を抑制しません

    2. PostgreSQLのすべてのユーザーに対して有効になっているすべてのロールを列挙するにはどうすればよいですか?

    3. mysqlは日付を現在の年の同じ日付に変換します

    4. 減算するときにphpでmysqlを更新する方法