例子模型
以下的MDX中用到的Hierarchy如下:
百分比
1)某個子項佔總體的百分比。比如:每種Product的銷售額佔所有Product銷售額的百分比。
'[Measures].[Internet Sales Amount]/([Measures].[Internet Sales Amount], [Product].[Product Categories].[All])' , FORMAT_STRING = '0.00%'
SELECT
{[Measures].[Internet Sales Amount], [Measures].[Sale Amount Ratio]} ON 0,
NON EMPTY [Product].[Product Categories].[Product Name].Members ON 1
FROM [Adventure Works]
2)某個子項佔其父項的百分比。比如:每種Product的銷售額佔其所屬的SubCategory銷售額的百分比。
'[Measures].[Internet Sales Amount]/
([Measures].[Internet Sales Amount], [Product].[Product Categories].CurrentMember.Parent)'
, FORMAT_STRING = '0.00%'
SELECT
{[Measures].[Internet Sales Amount], [Measures].[Sale Amount Ratio]} ON 0,
NON EMPTY CROSSJOIN([Product].[Subcategory].[Subcategory].Members,
[Product].[Product Categories].[Product Name].Members) ON 1
FROM [Adventure Works]
3)某個子項佔其祖先的百分比。比如:每種Product的銷售額佔其所屬的Category銷售額的百分比。
'[Measures].[Internet Sales Amount]/
([Measures].[Internet Sales Amount],
ANCESTOR([Product].[Product Categories].CurrentMember, [Product].[Product Categories].[Category]))'
, FORMAT_STRING = '0.00%'
SELECT
{[Measures].[Internet Sales Amount], [Measures].[Sale Amount Ratio]} ON 0,
NON EMPTY CROSSJOIN([Product].[Category].[Category].Members, [Product].[Product Categories].[Product Name].Members) ON 1
FROM [Adventure Works]
分配、分攤數量
1)根據一個Measure值來分配數量。比如:按照每種Product佔總體的銷售額多少來分攤成本。
'([Measures].[Internet Total Product Cost], [Product].[Product Categories].[All])*
[Measures].[Internet Sales Amount]/
([Measures].[Internet Sales Amount], [Product].[Product Categories].[All])'
, FORMAT_STRING = '0.00'
SELECT
{[Measures].[Internet Sales Amount], [Measures].[Product Cost]} ON 0,
NON EMPTY [Product].[Product Categories].[Product Name].Members ON 1
FROM [Adventure Works]
2)根據一個Hierarchy來分配數量。比如:在Product Hierarchy中計算每種Category的成本的時候,可以根據每種Category下有多少個產品來進行分配。
'([Measures].[Internet Total Product Cost], [Product].[Product Categories].[All])/
Count(
Descendants (
[Product].[Product Categories].CurrentMember,
[Product].[Product Categories].[Product Name],
SELF
),
INCLUDEEMPTY
)'
, FORMAT_STRING = '0.00'
SELECT
{[Measures].[Internet Sales Amount], [Measures].[Product Cost]} ON 0,
NON EMPTY [Product].[Product Categories].[Category].Members ON 1
FROM [Adventure Works]
平均值
1)簡單平均值。比如:計算一個月中每天平均的銷售額是多少。
[Measures].[Internet Sales Amount]/
COUNT(Descendants([Ship Date].[Fiscal].CurrentMember, [Ship Date].[Fiscal].[Date]), INCLUDEEMPTY)
SELECT
{[Measures].[Internet Sales Amount], Measures.[Avg Gross Profit Margin]} ON COLUMNS,
[Ship Date].[Fiscal].[month].Members ON ROWS
FROM [Adventure Works]
2)加權平均值。沒有想到好的例子。
基於時間的計算
1)同比和環比。比如:今年每月的銷售額和去年同期相比的變化
這裏要補充的是,在同比MDX中,採用COUSIN或ParallelPeriod都可以,但是採用ParallelPeriod更好一些。
2)累計到當前的統計。比如:得到一年中每一個月的累計銷售額。
SUM(
PeriodsToDate([Ship Date].[Fiscal].[Fiscal Year],[Ship Date].[Fiscal].CurrentMember),
[Measures].[Internet Sales Amount]
)
SELECT
{[Measures].[Internet Sales Amount], Measures.[Additive Internet Sales Amount]} ON COLUMNS,
[Ship Date].[Fiscal].[month].Members ON ROWS
FROM [Adventure Works]
3)移動平均值。比如:計算一種Category過去三個月的平均銷售額合計。
AVG(LastPeriods(3, [Date].[Calendar].CurrentMember),
[Measures].[Internet Sales Amount])
SELECT
{[Measures].[Internet Sales Amount], Measures.[Average Internet Sales Amount]} ON COLUMNS,
NON EMPTY ([Product].[Product Categories].[Category].Members,
DESCENDANTS([Date].[Calendar].[Calendar Year].&[2002], [Date].[Calendar].[Month], SELF)
) ON ROWS
FROM [Adventure Works]