将动态透视结果存储到 SQL Server 中的临时表中



我有以下架构和示例数据。

create table MyTable
(
    Id int,
    Year int,
    Channel varchar(10),
    Payments int
)
insert into MyTable values 
               (1,2012,'HV',100),
               (1,2014,'HV',56),
               (2,2012,'NL',17000)
               (2,2012,'HV',495), 
               (3,2013,'HV',565)

现在,我想在临时表中创建并插入动态数据透视数据。我能够在此处创建透视数据作为演示。

但我想将此数据存储到临时表中。我尝试过如下。

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
              ,B.*
         From  [dbo].[MyTable] A
         Cross Apply ( values ( Id, Channel + CONVERT(Varchar(4), Year)
                     )) B (Item,Value)
      ) S
 Pivot (sum([Payments]) For Channel + CONVERT(Varchar(4), Year) in 
 (' + Stuff((Select Distinct ','+QuoteName(Channel + CONVERT(Varchar(4), Year))                                                               
                                               From [dbo].MyTable
                                               Order By 1 
                                               For XML Path('')),1,1,'')  + ') ) p'
select @SQL
Exec(@SQL);
SELECT * FROM ##TempTable

它给了我以下错误。

消息 102,级别 15,状态 1,第 18 行 "+"附近的语法不正确。

打印动态查询时,它给出以下结果。

if object_id('tempdb..##TempTable') is not null  
begin      
    drop table ##TempTable  
end    
create table ##TempTable([Id] int null, [HV2012] Varchar(20) null,[HV2013] Varchar(20) null,[HV2014] Varchar(20) null,[NL2012] Varchar(20) null)  
INSERT INTO ##TempTable  
    Select *   From ( Select A.Id ,B.* From  [dbo].[MyTable] A 
        Cross Apply ( values ( Id, Channel + CONVERT(Varchar(4), Year) )) B (Item,Value) ) S   
        Pivot (sum([Payments]) For Channel + CONVERT(Varchar(4), Year) in ([HV2012],[HV2013],[HV2014],[NL2012]) ) p

如果您使用的是apply那么为什么您需要在PIVOT中进一步相同的逻辑(即 Channel + CONVERT(Varchar(4), Year) ),已在apply 中提供。

因此,我会在PIVOT中使用Value

. . . 
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

我没有进行任何更改,因为在执行之前需要进行许多更正。

最新更新