2014-09-18 42 views
0

我從客戶那裏得到了一個不尋常的報告要求,這真的讓我很滿意。我的來源是數據倉庫定期快照事實表,每個公司期間每位客戶的記錄數爲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

我還沒有想出如何在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