我相信我必须同时使用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
我希望能够通过Aux代码(动态)分离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小提琴:http://sqlfiddle.com/#!3/7f06d/1以及我使用动态数据透视表完成的所有工作。
有人可以指导我下一步做什么吗?我迷路了。
谢谢
答案 0 :(得分:3)
由于您尝试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)