用分析服務SSAS解決佔比、同比和環比問題
阿新 • • 發佈:2019-02-01
本文將介紹用分析服務SSAS如何解決佔比、同比和環比三個指標。
首先理解一下這三個指標的基本概念:
佔比是指當前成員的值與該成員父級的值的比率,意思是在總數中所佔的比重,比如某水果商店總銷售額為14,其中蘋果的銷售額為2,佔比就是14.3%。
同比是指在一個期間內的值與以前某個期間的值進行比較,並用以前期間值的百分比來表示,比如將今年的資料與去年的資料比較或將今年八月的資料與去年八月的資料比較。
環比是指當前成員的值與前一個成員的值的比率,比如將今年的下半年資料與上半年資料比較或將今年的八月的資料與七月的資料比較。
其中佔比一般不會運用在時間維度上,而佔比和同比均是運用在時間維度上。
那麼在分析服務中是如何解決這三個指標的呢?一般情況下,多維資料集中的每一個維度都會有層次結構,比如時間維度的層次結構,年-半年-季度-月-日或年-周-日,其中同比和環比正是在這個層次結構中進行比較。分析服務利用計算成員可以方便的解決以上三個指標,而且分析服務提供了相應的模板。
第一、佔比。
MDX語句定義如下:
CREATE MEMBER CURRENTCUBE.[Measures].[銷售數量在父級銷售單位的佔比] AS Case // Test to avoid division by zero. When IsEmpty ( [Measures].[Sell Num] ) Then Null // Test for current coordinate being on the (All) member. When [Dim Unit].[省-市-區-單位].CurrentMember.Level Is [Dim Unit].[省-市-區-單位].[(All)] Then 1 Else ( [Dim Unit].[省-市-區-單位].CurrentMember, [Measures].[Sell Num] ) / ( [Dim Unit].[省-市-區-單位].CurrentMember.Parent, [Measures].[Sell Num] ) End, FORMAT_STRING = "Percent";
第二、同比。
MDX語句定義如下:
CREATE MEMBER CURRENTCUBE.[Measures].[銷售數量期間增長率] AS Case // Test for current coordinate being on (All) member. When [Dim Date].[年-半年-季度-月-日].CurrentMember.Level Is [Dim Date].[年-半年-季度-月-日].[(All)] Then "NA" // Test to avoid division by zero. When IsEmpty( ( [Measures].[Sell Num],ParallelPeriod( [Dim Date].[年-半年-季度-月-日].[Yearly SK], 1, [Dim Date].[年-半年-季度-月-日].CurrentMember ) ) ) Then Null Else ( (([Dim Date].[年-半年-季度-月-日].CurrentMember,[Measures].[Sell Num]) -( [Measures].[Sell Num],ParallelPeriod( [Dim Date].[年-半年-季度-月-日].[Yearly SK], 1, [Dim Date].[年-半年-季度-月-日].CurrentMember ))) / ( [Measures].[Sell Num],ParallelPeriod( [Dim Date].[年-半年-季度-月-日].[Yearly SK], 1, [Dim Date].[年-半年-季度-月-日].CurrentMember ))) End // This expression evaluates the difference between the value of the numeric // expression in the previous period and that of the current period, as a // percentage of the previous period's value. FORMAT_STRING = "Percent";
第三、環比。
MDX語句定義如下:
CREATE MEMBER CURRENTCUBE.[Measures].[銷售數量環比]
AS
Case
// Test for current coordinate being on (All) member.
When [Dim Date].[年-半年-季度-月-日].CurrentMember.Level Is
[Dim Date].[年-半年-季度-月-日].[(All)]
Then "NA"
// Test to avoid division by zero.
When IsEmpty(
(
[Measures].[Sell Num],
[Dim Date].[年-半年-季度-月-日].CurrentMember.PrevMember
)
)
Then Null
Else (
(([Dim Date].[年-半年-季度-月-日].CurrentMember,[Measures].[Sell Num])
-(
[Measures].[Sell Num],
[Dim Date].[年-半年-季度-月-日].CurrentMember.PrevMember)
)
/
(
[Measures].[Sell Num],
[Dim Date].[年-半年-季度-月-日].CurrentMember.PrevMember))
End,
FORMAT_STRING = "Percent";