2014-07-18 21 views
0

我有,我想UNPIVOT逆透視數據與多列 - 語法幫助請

enter image description here

我創造了這個查詢UNPIVOT的「實際」行,但似乎無法以下數據找出未計劃'計劃'和'優先'的語法。

SELECT FiscalYear, Period, MetricName, ActualValue 
FROM vw_ExecSummary 
UNPIVOT 
(ActualValue FOR MetricName IN ([Net Revenue], [Total C.S. Salaries] 
)) AS unpvt 
WHERE [Type] = 'Actual' 

逆轉置數據看起來是這樣,但我想還計劃和PriorYear列添加到ActualValue欄的右側下方

enter image description here

任何幫助將不勝感激。謝謝。

回答

1

我目前無法測試此功能,但我認爲它可以像這樣工作。首先,你需要UNPIVOT所有數據:

SELECT fiscalYear, period, type, metricName, metricValue 
FROM vw_ExecSummary 
UNPIVOT (metricValue FOR metricName IN ([Net Revenue], [Total C.S. Salaries])) unpvt 

應該產生看起來是這樣的一個表,該表:

fiscalYear period type  metricName    metricValue 
=================================================================== 
15   1  'Actual' 'Net Revenue'   3676798.98999997 
15   1  'Actual' 'Total C.S. Salaries' 1463044.72 
15   1  'Plan' 'Net Revenue'   3503920.077405 
...................... (remaining rows omitted) 

然後我們可以PIVOT行正常,以獲得新的列(這就是它的用途):

SELECT fiscalYear, period, metricName, 
     [Actual] AS actualValue, [Plan] AS planValue, [PriorYear] AS priorYearValue 
FROM <previous_data> 
PIVOT (SUM(metricValue) FOR (type IN ([Actual], [Plan], [PriorYear]) pvt 

SUM(...)實際上不應該做一個ything這裏,作爲推測其他列包含唯一行,但我們需要使用聚合函數)

...這應該產生一個類似於如下:

fiscalYear period metricName  actualValue  planValue  priorYearValue 
====================================================================================== 
15   1  'Net Revenue' 3676798.98999997 3503920.077405 40436344.4499999 
...................................... (remaining rows omitted) 

所以把它在一起應該是這樣的:

SELECT fiscalYear, period, metricName, 
     [Actual] AS actualValue, [Plan] AS planValue, [PriorYear] AS priorYearValue 
FROM (SELECT fiscalYear, period, type, metricName, metricValue 
     FROM vw_ExecSummary 
     UNPIVOT (metricValue FOR metricName IN ([Net Revenue], [Total C.S. Salaries])) unpvt) unpvt 
PIVOT (SUM(metricValue) FOR type IN ([Actual], [Plan], [PriorYear])) AS pvt 

SQL Fiddle Example


我只有一個顧慮,但:值一樣3676798.989999973503920.077405等,讓我覺得那些列浮點(即REALFLOAT),但值被命名爲貨幣用途。如果是這種情況....你知道浮點值不能正確地存儲像.1的東西,正確(即,你實際上不能添加一個角錢的價值)?而且,當數值變得足夠大時,您不能再添加1?通常在處理貨幣價值時,您應該使用基於定點類型的東西,如DECIMALNUMERIC

+0

感謝,該解決方案 - 當場上!我沒有注意到在PIVOT語句中的'type'這個單詞不正確之前的括號。我刪除了它,並在PIVOT聲明的末尾添加了一個右括號。像魅力一樣工作! – Jason

+0

@Jason - 啊,謝謝。 #更正#。這就是爲什麼我喜歡先測試它們。那麼,這兩種金錢列的類型是什麼? –

+0

我相信這種類型是浮動的(目前不在我工作的筆記本電腦前)。 – Jason

0

這是Itzig Ben-Gan's cross apply values pivoting一種情況:

create table #data (FiscalYear smallint, Period tinyint, ValueType nvarchar(25), NetRevenue float, Salaries float); 
insert into #data values 
    (15,1,N'Actual',3676798.98999,1463044.71999), 
    (15,1,N'Plan',3503920.977405,1335397.32878), 
    (15,1,N'PriorYear',4043634.449,1543866.89); 

select d.FiscalYear, d.Period, 
     ActualNetRevenue = sum(v.ActualNetRevenue), ActualSalaries = sum(v.ActualSalaries), 
     PlanNetRevenue = sum(v.PlanNetRevenue), PlanSalaries = sum(v.PlanSalaries), 
     PriorYearNetRevenue = sum(v.PriorYearNetRevenue), PriorYearSalaries = sum(v.PriorYearSalaries) 
from #data d 
cross apply 
     (values 
     (N'Actual',d.NetRevenue,d.Salaries,0,0,0,0), 
     (N'Plan',0,0,d.NetRevenue,d.Salaries,0,0), 
     (N'PriorYear',0,0,0,0,d.NetRevenue,d.Salaries)) 
     v (ValueType, ActualNetRevenue, ActualSalaries, PlanNetRevenue, PlanSalaries, PriorYearNetRevenue, PriorYearSalaries) 
where d.ValueType = v.ValueType 
group by d.FiscalYear, d.Period; 

drop table #data; 
+0

謝謝,但本例將所有項目放在一行中。上面的解決方案就是我打算做的。 – Jason