2015-08-14 2 views
0

Я читал различные примеры на этой плате, но не смог поднять динамический сводный запрос в соответствии с моим кодом. Любая помощь будет оценена!SQL Server - Dynamic Pivot Query

У меня есть две таблицы

AuxDef

Fieldnumber Fieldlabel 
------------------------ 
1   Buyer 
2   Size Range 
3   Source 
4   Country 
5   Vendor 
ect...  ect... 

AuxFields

PageID FieldNumber TextValue 
----------------------------------- 
1  1    Sam 
1  2    S-L 
1  3    Domestic 
1  4    Canada 
2  1    Kyla 
2  3    Import 
2  5    VendorName 
2  6    Off-Shore 
2  7    Fit 1 
2  8    Yes 
4  1    Sara 
4  3    Import 
4  4    China 
ect.. ect..   ect.. 

То, что я хотел бы сделать, это создать динамический стержень, который соединяет две таблицы по fieldnumber и использует fieldlabels как заголовки столбцов после pageid. Это было бы похоже на это.

PageID Buyer  Size Range Source  Country Vendor  Type  Status Exclusive ect.. 
------------------------------------------------------------------------------------------------ 
1  Sam  S-L   Domestic Canada 
2  Kyla     Import    VendorName Off-Shore Fit 1 Yes 
4  Sara     Import  China 

Я пробовал примеры на этом сайте, но я постоянно работаю в ошибки либо когда я заменяю поле с моими или в реальной генерации столбцов.

+5

Вы можете разместить код, который вы пробовали, и какова была ошибка r eturned? –

ответ

0

Вам нужно будет создать динамический стержень (кредит на @bluefeet's answer here) что-то вроде этого:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX); 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.FieldLabel) 
      FROM auxdef c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT PageID, ' + @cols + ' from 
      (
      select 
       PageId, 
       FieldLabel, 
       TextValue 
      from AuxFields af 
      inner join auxdef ad on af.FieldNumber = ad.FieldNumber 
      ) x 
      pivot 
      (
       max(TextValue) 
       for FieldLabel in (' + @cols + ') 
      ) p ' 


execute(@query); 

SQL Fiddle Demo

0

Вот еще один способ

sql fiddle

declare @sql nvarchar(max) 
select @sql = 'select af.pageId' 

select @sql = @sql + ', max(case when ad.fieldLabel = ''' + ad.fieldLabel + ''' then af.textValue end) as [' + ad.fieldLabel + ']' + char(13) 
from auxDef ad 

select @sql = @sql + 'from auxDef ad' + char(13) 
+ 'inner join auxFields af on af.fieldNumber = ad.fieldNumber' + char(13) 
+ 'group by af.pageId' 

exec(@sql)