展平定期快照事实表

时间:2014-09-18 16:17:03

标签: sql-server-2008 tsql data-warehouse

我有一个不寻常的报告要求来自客户,这真的让我适合。我的来源是一个数据仓库定期快照事实表,每个公司期间每个客户的记录数为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年以来每年都有一个表,然后继续。

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

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我还没想出如何在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

相关问题