2016-11-21 3 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); 

ich dies aus den obigen Code:SQL dynamische Pivot für mehrere Spalten

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

i wie müssen diese

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

von oben Code erhalten i Preis nur

+0

Ihr Code macht mir Angst. Verwenden Sie parameterzation, um SQL-Injection zu vermeiden. Außerdem hat SQL sys -Tabellen, die diese dynamisch und portierbar machen (sys.tables und sys.columns). –

Antwort

2

Nur eine kleine Wendung zu Ihrem Original. Beachten Sie die Unterabfrage/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); 

Returns

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

Es funktioniert, aber viel Zeit nehmen können Sie es ändern – Venkat

+0

@Venkat Glücklich zu helfen –

+0

@Venkat Wenn Sie viel Zeit sagen. Wie viel Zeit und wie viele Datensätze in Ihrer Auswahltabelle? –