sql >> Database teknologi >  >> RDS >> Sqlserver

Lagring af dynamiske pivotresultater i en midlertidig tabel i SQL Server

Hvis du bruger apply så hvorfor har du brug for yderligere samme logik i PIVOT (dvs. Channel + CONVERT(Varchar(4), Year) ), som allerede er tilgængelig i apply .

Så jeg ville bruge Value i stedet i PIVOT :

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

Så din opdaterede Dynamic SQL ville være :

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
 

Jeg har ikke foretaget nogen ændringer, da der er mange rettelser, der skal foretages før udførelse.




  1. Hvordan kan jeg fortælle PostgreSQL ikke at afbryde hele transaktionen, når en enkelt begrænsning har fejlet?

  2. Tabel kan ikke oprettes i mysql -Error 1064

  3. Arkivering af store mængder gamle data i SQL Server

  4. Fejl(5,3):PLS-00103:Opstod symbolet BEGIN, da man forventede et af følgende:sprog