我目前无法测试此功能,但我认为它可以像这样工作。首先,你需要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