SQL Server - 动态数据透视查询
问题描述:
我一直在阅读这个板上的各种示例,但一直未能掀起动态数据透视查询来适应我的代码。任何帮助,将不胜感激!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
我试过这个网站上的例子,但是当我用自己的字段或实际的列代替字段时,我仍然遇到错误。
答
你需要创建一个动态的枢轴(信贷@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)
你能后的你试过的代码和它的错误是什么eturned? –