2015-08-14 197 views
0

我一直在阅读这个板上的各种示例,但一直未能掀起动态数据透视查询来适应我的代码。任何帮助,将不胜感激!SQL Server - 动态数据透视查询

我有两个表

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

你能后的你试过的代码和它的错误是什么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)