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

動的ピボットの結果を SQL Server の一時テーブルに保存する

    apply を使用している場合 PIVOT でさらに同じロジックが必要な理由 (つまり、Channel + CONVERT(Varchar(4), Year) ) apply で既に利用可能です .

    だから、私は Value を使用します 代わりに PIVOT で :

    <プレ>. . . Pivot (sum([Payments]) For [Value] in ([HV2012],[HV2013],[HV2014],[NL2012]) ) p,

    それで、更新された Dynamic SQL

    Declare @SQL varchar(max) = '    
    if object_id(''tempdb..##TempTable'') is not null
    begin
        drop table ##TempTable
    end
    
    create table ##TempTable([Id] int null, ' + 
                Stuff((Select Distinct ','+QuoteName(Channel + CONVERT(Varchar(4), Year)) + ' Varchar(20) null'            
                From [dbo].MyTable
                Order By 1 
                For XML Path('')),1,1,'')+ ')
    INSERT INTO ##TempTable
    Select *
     From (
            Select A.ID, A.Payments
                  ,B.*
             From  [dbo].MyTable a 
             Cross Apply ( values ( Channel + CONVERT(Varchar(4), Year)
                         )) B ([Value])
          ) S
     Pivot (sum([Payments]) For [Value] in 
     (' + Stuff((Select Distinct ','+QuoteName(Channel + CONVERT(Varchar(4), Year))                                                               
                                                   From #tm
                                                   Order By 1 
                                                   For XML Path('')),1,1,'')  + ') ) p'
    
    print @sql
    
    Exec(@SQL)
    
    SELECT * FROM ##TempTable
      

    実行前に多くの修正が必要なため、変更は行っていません。




    1. MySQL CREATETEMPORARYTABLEエラー

    2. Where句または代替オプションでエイリアスを使用していますか?

    3. SQLServerの句によるグループ化を理解する-SQLServer/TSQLチュートリアルパート130

    4. 未定義の関数oci_connect、php_oci8_12c.dll、Windows 8.1、php5.6.6を呼び出します