這一小節主要介紹如何在一個平行期間的度量值,當前值的對比對象是指當前值的上一年,上一個季度或者其它時間級別上與當前值同一時間點上的的那個對象。有一個非常常見的需求就是對比上一年同一個時間點的某個值來判斷在現在同期的時候這個值的大小是上升了還是下降了。
先顯示基於月份成員的銷售額情況 -
使用 PARALLELEPRIOD(Level, N, Member) 先把同比值查詢出來,Level 指定的是年,1 表示 1年前,Member 就是指當前成員並且表示月。所以整個表達的意思就是查詢當前成員1年前的相對應的那個月的 Reseller Sales Amount 的值是多少。
WITH MEMBER [Measures].[Reseller Sales PP]
AS ( PARALLELPERIOD( [Date].[Fiscal].[Fiscal Year], 1, [Date].[Fiscal].CurrentMember ), [Measures].[Reseller Sales Amount] ),FORMAT = "Currency" SELECT { [Measures].[Reseller Sales Amount], [Measures].[Reseller Sales PP] } ON 0, {[Date].[Fiscal].[Month].MEMBERS} ON 1
FROM [Adventure Works]
由於 2005年之前沒有數據,因此就沒有上一年的對比,但是從 2006年開始就有對應的對象了。
全部查詢出來,包括上一個同期的對象,PP 值以及同比率。
WITH MEMBER [Measures].[Member PP Name]
AS PARALLELPERIOD( [Date].[Fiscal].[Fiscal Year], 1, [Date].[Fiscal].CurrentMember ).NAME MEMBER [Measures].[Reseller Sales PP]
AS ( PARALLELPERIOD( [Date].[Fiscal].[Fiscal Year], 1, [Date].[Fiscal].CurrentMember ), [Measures].[Reseller Sales Amount] ),FORMAT = "Currency" MEMBER [Measures].[Reseller Sales YoY%]
AS IIF( [Measures].[Reseller Sales PP] = 0, NULL, [Measures].[Reseller Sales Amount]/[Measures].[Reseller Sales PP] ) ,FORMAT = "PERCENT" SELECT { [Measures].[Reseller Sales Amount], [Measures].[Member PP Name], [Measures].[Reseller Sales PP], [Measures].[Reseller Sales YoY%] } ON 0, {[Date].[Fiscal].[Month].MEMBERS} ON 1
FROM [Adventure Works]
查詢結果 -
其實 PARALLELPERIOD() 函數不光可以用在時間層次結構上,同樣它也可以用在其它非時間層次結構中,比如這段代碼 - [CA]&[US] 這個州成員在國家這個級別上將自己所在國家成員往前移動兩個位置下的同等位置的州成員的銷售額。
SELECT {[Measures].[Reseller Sales Amount]} ON 0, { ParallelPeriod( [Geography].[Geography].[Country], 2, [Geography].[Geography].[State-Province].&[CA]&[US] ) } ON 1
FROM [Adventure Works]
先來看國家, United States 的前兩個位置的成員是 Germany。
California 在 US 下的位置 和 Hamburg 在 Germany 下的位置也是一致的。
關於 PARALLELPERIOD() 函數的使用,我的這篇 MDX 讀書筆記中有詳細的解釋 - MDX Step by Step 讀書筆記(九) - Working with Time 處理時間
更多 BI 文章請參看 BI 系列隨筆列表 (SSIS, SSRS, SSAS, MDX, SQL Server)