展平定期快照事实表

展平定期快照事实表

问题描述:

我从客户那里得到了一个不寻常的报告要求,这真的让我很满意。我的来源是数据仓库定期快照事实表,每个公司期间每位客户的记录数为1。他们要求的基本上是一个修改的支点。展平定期快照事实表

请考虑简单的例子。在这个例子中,我使用了Customer Name来使记录更容易遵循,真正的解决方案使用Fact表和Dimensions以及替代键。

IF OBJECT_ID ('tempdb..#PeriodicSnapshot') IS NOT NULL 
    DROP TABLE #PeriodicSnapshot 

CREATE TABLE #PeriodicSnapshot 
(
    CompanyPeriod  INT 
    ,CustomerName   VARCHAR (25) 
    ,AdvancedThisPeriod DECIMAL (9, 2) 
    ,PaymentsThisPeriod DECIMAL (9, 2) 
) 

Insert into #PeriodicSnapshot 
(CompanyPeriod, CustomerName, AdvancedThisPeriod, PaymentsThisPeriod) 
Values 
(201401, 'Yoda', 200.00, 50.00) 
,(201401, 'Darth Vader', 0, 0) 
,(201402, 'Yoda', 0, 0) 
,(201402, 'Darth Vader', 100.00, 20.00) 
,(201403, 'Yoda', 0, 50.00) 
,(201403, 'Darth Vader', 0, 0) 

我需要拿上面的表,并提供像这样的结果,最好使用T-SQL。

Flattened Data Set

请注意,列名的别名,因为粮食改为每年一次的客户。请记住,原始表格中实际上有30多列,并且它们也必须变平。

我意识到这很糟糕,而且他们以这种方式滥用数据库。但是,客户坚持认为他们需要这种格式的数据来提供单独的预测算法。我唯一的选择是实际实例化这些表格,从2008年开始每年一次,并且向前发展。

生成此数据集的查询不需要执行得特别好,因为它只会每周(当前年份)和周末运行一次。

有什么建议吗?

我还没有想出如何在SQL转动,但下面的代码工作

with companyper as (
select 
CustomerName, 

case when CompanyPeriod = '201401' then (AdvancedThisPeriod) end as 'AdvacnedThisPeroid_201401', 
case when CompanyPeriod = '201401' then (PaymentsThisPeriod) end as 'PaymentsThisPeriod_201401', 
case when CompanyPeriod = '201402' then (AdvancedThisPeriod) end as 'AdvacnedThisPeroid_201402', 
case when CompanyPeriod = '201402' then (PaymentsThisPeriod) end as 'PaymentsThisPeriod_201402' 

from #PeriodicSnapshot) 

select 
CustomerName, 
SUM(AdvacnedThisPeroid_201401) as ATP201401, 
SUM(PaymentsThisPeriod_201401) AS PTP201401, 
SUM(AdvacnedThisPeroid_201402) as ATP201402, 
SUM(PaymentsThisPeriod_201402) AS PTP201402 


from 
companyper 

group by CustomerName 

enter image description here

+0

或者你可以把查询到Excel,并Excel数据透视出来的数据,右键点击,刷新如所须。 – lookslikeanevo 2014-09-19 15:49:20

+0

或者你可以运行一个相当平凡的MDX查询。 – nsousa 2014-09-20 17:17:47