我有一个不寻常的报告要求来自客户,这真的让我适合。我的来源是一个数据仓库定期快照事实表,每个公司期间每个客户的记录数为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。
请注意,列名称是别名,因为每年将谷物更改为一个客户。请记住,原始表中实际上有30多列,它们也必须被展平。
我意识到这很糟糕,他们以这种方式滥用数据库。但是,客户坚持要求他们需要这种格式的数据来提供单独的预测算法。我唯一的另一种选择是实际实例化这些表,自2008年以来每年都有一个表,然后继续。
生成此数据集的查询不需要执行得特别好,因为它只会每周运行一次(当前年份)和一个周末。
有什么建议吗?
答案 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