【发布时间】:2014-09-18 16:17:02
【问题描述】:
我从一位客户那里得到了一个不寻常的报告要求,这真的让我很为难。我的来源是一个数据仓库定期快照事实表,每个公司期间每个客户有 1 条记录。他们需要的本质上是一个修改过的支点。
请考虑简化示例。我在此示例中使用了客户名称以使记录更易于理解,这是使用事实表和具有代理键的维度的真正解决方案。
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。
请注意,列名称是别名,因为粒度更改为每年一个客户。请记住,原始表中实际上有超过 30 列,它们也必须被展平。
我意识到这很糟糕,他们正在以这种方式滥用数据库。但是,客户坚持认为他们需要这种格式的数据来提供单独的预测算法。我唯一的另一种选择是实际实例化这些表,自 2008 年以来每年一个,并继续向前。
生成此数据集的查询不需要执行得特别好,因为它只会每周运行一次(针对本年度)和一个周末。
有什么建议吗?
【问题讨论】:
标签: sql-server-2008 tsql data-warehouse