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);
这是另一种方式
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)
我一直在阅读此板上的各种示例,但无法启动动态数据透视查询以适合我的代码。任何帮助,将不胜感激!
我有两个表
辅助定义
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);
这是另一种方式
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)