【发布时间】:2014-01-31 16:35:42
【问题描述】:
假设我有一个表格,其中包含以下形式的数据:
Foo_FK MonthCode_FK Activity_FK SumResultsX SumResultsY
-----------------------------------------------------------
1 201312 0 10 2
1 201312 1 5 1
1 201401 0 15 3
1 201401 1 7 2
2 201312 0 9 3
2 201312 1 1 2
2 201401 0 6 2
2 201401 1 17 4
出于我的目的,可以安全地假设此表是由 Foo_FK, MonthCode_FK, Activity_FK 上的 GROUP BY 和 SUM( ResultsA ), SUM( ResultsB ) 创建的聚合以获取数据,从而使 Foo_FK, MonthCode_FK, Activity_FK 每条记录唯一。
如果出于某种原因,我发现在存储过程中比 PIVOT 这个表更可取,以减轻我必须做的 SSRS 操作量(无疑是以后维护),希望获得以下格式通过矩阵 tablix 消费:
Foo_FK 1312_0_X 1312_0_Y 1312_1_X 1312_1_Y 1401_0_X 1401_0_Y 1401_1_X 1401_1_Y
--------------------------------------------------------------------------------------
1 10 2 5 1 15 3 7 2
2 9 3 1 2 6 2 17 4
我将如何以一种非精神的方式来做这件事?请参阅此SQL Fiddle 以证明我可能会尝试使用锤子来构建一个推入钉子的设备。不用担心动态版本,因为我确信一旦指导我完成此测试用例的静态解决方案,我就能弄清楚。
现在,我尝试通过以下方式创建一个Foo_FK, MonthCode_FK 集,然后我尝试将其设置为PIVOT(see the Fiddle for the full mess):
SELECT Foo_FK = ISNULL( a0.Foo_FK, a1.Foo_FK ),
MonthCode_FK = ISNULL( a0.MonthCode_FK, a1.MonthCode_FK ),
[0_X] = ISNULL( a0.SumResultX, 0 ),
[0_Y] = ISNULL( a0.SumResultY, 0 ),
[1_X] = ISNULL( a1.SumResultX, 0 ),
[1_Y] = ISNULL( a1.SumResultY, 0 )
FROM ( SELECT Foo_FK, MonthCode_FK, Activity_FK,
SumResultX, SumResultY
FROM dbo.t_FooActivityByMonth
WHERE Activity_FK = 0 ) a0
FULL OUTER JOIN (
SELECT Foo_FK, MonthCode_FK, Activity_FK,
SumResultX, SumResultY
FROM dbo.t_FooActivityByMonth
WHERE Activity_FK = 1 ) a1
ON a0.Foo_FK = a1.Foo_FK;
我遇到了一些excellent advice on this SO question,所以我正在使用PIVOT 和MAX 扭转一切之前执行某种形式的UNPIVOT,但如果有更好的方法这个,我听好了。
【问题讨论】:
标签: sql-server-2008-r2 pivot unpivot