SQL 服务器 - 动态数据透视查询

SQL Server - Dynamic Pivot Query

我一直在阅读此板上的各种示例,但无法启动动态数据透视查询以适合我的代码。任何帮助,将不胜感激!

我有两个表

辅助定义

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

辅助场

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..

我想做的是创建一个动态数据透视表,通过字段编号连接两个表,并将字段标签用作 pageid 之后的列 headers。它看起来类似于此。

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

我已经尝试过此站点上的示例,但是当我用自己的字段替换字段时或在实际的列生成中,我总是 运行 出错。

您将需要创建一个动态枢轴(归功于 @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

这是另一种方式

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)