2016-11-21 118 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表中有多少時間和多少記錄? –