我目前無法測試此功能,但我認爲它可以像這樣工作。首先,你需要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.98999997
,3503920.077405
等,讓我覺得那些列浮點(即REAL
或FLOAT
),但值被命名爲貨幣用途。如果是這種情況....你是知道浮點值不能正確地存儲像.1
的東西,正確(即,你實際上不能添加一個角錢的價值)?而且,當數值變得足夠大時,您不能再添加1
?通常在處理貨幣價值時,您應該使用基於定點類型的東西,如DECIMAL
或NUMERIC
。
感謝,該解決方案 - 當場上!我沒有注意到在PIVOT語句中的'type'這個單詞不正確之前的括號。我刪除了它,並在PIVOT聲明的末尾添加了一個右括號。像魅力一樣工作! – Jason
@Jason - 啊,謝謝。 #更正#。這就是爲什麼我喜歡先測試它們。那麼,這兩種金錢列的類型是什麼? –
我相信這種類型是浮動的(目前不在我工作的筆記本電腦前)。 – Jason