我相信我必须同时使用 Pivot 和 UnPivot 来获取我想要的数据。
我当前的数据如下所示:
var_date var_attribute var_out_of_ad var_per_ad
9/4/2012 Aux1 0 0
9/5/2012 Aux1 0 0
9/4/2012 Aux2 1680 0.733333333
9/5/2012 Aux2 1680 0.733333333
9/4/2012 Aux3 1500 0.791666667
9/5/2012 Aux3 1500 0.791666667
9/4/2012 Aux4 0 0
9/5/2012 Aux4 0 0
9/4/2012 Aux5 0 0
9/5/2012 Aux5 0 0
9/4/2012 Aux6 26640 0.766929134
9/5/2012 Aux6 26640 0.766929134
9/4/2012 Aux7 28800 0
9/5/2012 Aux7 28800 0
9/4/2012 Aux8 3600 0
9/5/2012 Aux8 3600 0
我希望能够通过辅助代码(动态)分解列 var_out_of_ad
和 var_per_ad
所以我希望我的数据如下所示:
var_date Aux1_per Aux1_out Aux2_per Aux2_out ...
9/4/2012 0 0 .733 1680
9/5/2012 0 0 .733 1680
我已将测试数据放入sql fiddle中:http://sqlfiddle.com/#!3/7f06d/1以及我用动态枢轴所做的所有工作。
有人可以指导我下一步该怎么做吗?我迷路了。
谢谢
最佳答案
由于您尝试PIVOT
两列数据,因此需要先UNPIVOT
,然后应用PIVOT
:
DECLARE @colsPivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @colsPivot = Stuff((Select distinct ','
+ QuoteName([var_attribute] + x.type)
from mytable
cross apply
(
select '_per' type
union all
select '_out' type
) x
FOR XML Path(''), Type
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'select var_date, ' + @colsPivot + '
from
(
select var_date,
val,
case col when ''var_out_of_ad''
then VAR_ATTRIBUTE + ''_out''
when ''var_per_ad''
then VAR_ATTRIBUTE + ''_per'' end var_attribute
from
(
select var_date, var_attribute,
cast(var_out_of_ad as float) var_out_of_ad,
var_per_ad
from mytable
) x
unpivot
(
val
for col in (var_out_of_ad, var_per_ad)
) u
) x1
pivot
(
max(val)
for var_attribute in ('+@colsPivot +')
)p'
exec(@query)
参见SQL Fiddle with Demo
关于sql - 使用动态透视/逆透视来正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12531522/