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

SQL Server :行を列に

    動的 SQL を使用する場合の私の提案は、常に最初にハードコードされたクエリを作成することです。これにより、正しいロジックを取得してから動的 SQL に変換できます。

    3 列のデータをピボットしようとしているので、最初に type_ds のピボットを解除します , expdt と comdt` 列、次に PIVOT 関数を適用します。

    クエリのハードコーディングされたバージョンは次のようになります:

    SELECT  *
    FROM    
    (   
      select pro_id,
        type_ds = case 
                    when col ='type_ds' 
                    then type_ds 
                    else type_ds+col end,
        value
      from
      (
         SELECT A.Pro_Id,
           c.Type_DS,
           convert(varchar(10), b.ExpDt, 120) ExpDt, 
           convert(varchar(10), b.ComDt, 120) ComDt
         FROM  dbo.Project A  
         left join [dbo].[Prj_App] B 
            on A.Pro_id = B.Pro_Id
         right outer join dbo.Approval_Type C 
            on B.App_Id = C.App_ID
       ) s
       cross apply
       (
          select 'type_ds', type_ds union all
          select 'expdt', expdt union all
          select 'comdt', comdt
       ) c (col, value)
    ) data
    PIVOT
    (   
      MAX(value)
      FOR Type_DS IN (RMC2, RMC2expdt, RMC2comdt,
                       RMC1, RMC1expdt, RMC1comdt) 
    ) pvt1                                        
    

    SQL Fiddle with Demo を参照してください。 .クエリの作業バージョンができたので、動的 SQL に簡単に変換できます。

    DECLARE @SQL1 NVARCHAR(MAX) = ''
    DECLARE @SQL NVARCHAR(MAX) = ''
    
    SELECT  @SQL1 = STUFF((SELECT ',' + QUOTENAME(Type_Ds) + ',' +  QUOTENAME(Type_Ds + 'ExpDt') + ',' + QUOTENAME(Type_Ds + 'ComDt')
                        from dbo.Approval_Type 
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')   
    
    
    SET @SQL = 'SELECT  *
                FROM    
                (   
                  select pro_id,
                    type_ds = case 
                                when col =''type_ds'' 
                                then type_ds 
                                else type_ds+col end,
                    value
                  from
                  (
                     SELECT A.Pro_Id,
                       c.Type_DS,
                       convert(varchar(10), b.ExpDt, 120) ExpDt, 
                       convert(varchar(10), b.ComDt, 120) ComDt
                     FROM  dbo.Project A  
                     left join [dbo].[Prj_App] B 
                        on A.Pro_id = B.Pro_Id
                     right outer join dbo.Approval_Type C 
                        on B.App_Id = C.App_ID
                   ) s
                   cross apply
                   (
                      select ''type_ds'', type_ds union all
                      select ''expdt'', expdt union all
                      select ''comdt'', comdt
                   ) c (col, value)
               ) data
               PIVOT
               (   
                  MAX(value)
                  FOR Type_DS IN (' + @SQL1 + ') 
               ) pvt1 '
    
    --print @SQL
    EXECUTE SP_EXECUTESQL @SQL
    

    デモによる SQL Fiddle を参照してください。




    1. PHPの配列にprint_r()を適用すると、なぜリソースID#4を取得するのですか?

    2. SQL Server:CREATEDATABASEでパラメーターを使用する

    3. PostgreSQLバックアップの自動テスト

    4. PDOを使用したfetchAllヘルパー関数