2016-11-21 81 views
1
DECLARE @cols AS NVARCHAR(MAX), 
@query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(Symbol) 
       from Opt 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 
set @query = 'SELECT Date,' + @cols + ' from 
     (
      select Date, Symbol, Price 
      from Opt 
     )x 
     pivot 
     (
      max(Price) 
      for Symbol in (' + @cols + ') 
     ) p' 

execute(@query); 

我得到这个从上面的代码:SQL动态枢纽多个列

Symbols(varchar50)  Date  price  quantity 
apple    14/11/2016 30  15 
banana    14/11/2016 22  20 

我需要这样的

Date  apple_price apple_quantity banana_price banana_quantity 
14/11/2016 30   15     22   10 

从上面的代码中,我得到的只是价格

+0

您的代码让我害怕。使用参数化来避免SQL注入。此外,SQL有sys表,可以使这种动态和便携式(sys.tables和sys.columns浮现在脑海)。 –

回答

2

刚一个小小的转折给你的原始。注意子查询/ Union All。

Declare @SQL varchar(max) 
Select @SQL = Stuff((Select Distinct 
          ',' + QuoteName(Symbol+'_Price') 
          + ',' + QuoteName(Symbol+'_Quantity') 
         From Opt For XML Path('')),1,1,'') 
Select @SQL = 'Select Date,' + @SQL + ' 
       From (
         Select Date,Item=Symbol+''_Price'',Val=Price From Opt 
         Union All 
         Select Date,Item=Symbol+''_Quantity'',Val=Quantity From Opt 
        ) A 
       Pivot (max(Val) For Item in (' + @SQL + ')) p' 

Exec(@SQL); 

返回

Date   apple_Price apple_Quantity banana_Price banana_Quantity 
2016-11-14 30    15    22    20 
+0

这是工作,但需要很多时间,你可以修改它 – Venkat

+0

@Venkat高兴地帮助 –

+0

@Venkat当你说很多时间。 Opt表中有多少时间和多少记录? –