Использование динамического Pivot/Unpivot для корректного отображения
Я считаю, что мне придется использовать как 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 , а также всю работу, которую я проделал с динамическим поворотом.
Может кто-нибудь, пожалуйста подскажите мне, что делать дальше? Я заблудился.
Спасибо
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