本文介绍了一些经常编写的MDX语句的写法。以下MDX语句可以在SSAS的示例库:Adventure Works中运行。
例子模型
以下的MDX中用到的Hierarchy如下:
百分比
1)某个子项占总体的百分比。比如:每种Product的销售额占所有Product销售额的百分比。
例子模型
以下的MDX中用到的Hierarchy如下:
百分比
1)某个子项占总体的百分比。比如:每种Product的销售额占所有Product销售额的百分比。
WITH
MEMBER
[
Measures
]
.
[
Sale Amount Ratio
]
AS
' [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 ]
' [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销售额的百分比。
WITH
MEMBER
[
Measures
]
.
[
Sale Amount Ratio
]
AS
' [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 ]
' [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销售额的百分比。
WITH
MEMBER
[
Measures
]
.
[
Sale Amount Ratio
]
AS
' [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 ]
' [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占总体的销售额多少来分摊成本。
WITH
MEMBER
[
Measures
]
.
[
Product Cost
]
AS
' ([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 ]
' ([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下有多少个产品来进行分配。
WITH
MEMBER
[
Measures
]
.
[
Product Cost
]
AS
' ([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 ]
' ([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)简单平均值。比如:计算一个月中每天平均的销售额是多少。
WITH
MEMBER Measures.
[
Avg Gross Profit Margin
]
AS
[ 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 ]
[ 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)同比和环比。比如:今年每月的销售额和去年同期相比的变化
参见前两天写的Blog : http://www.cnblogs.com/microsheen/archive/2006/10/28/542818.html,这里要补充的是,在同比MDX中,采用COUSIN或ParallelPeriod都可以,但是采用ParallelPeriod更好一些。
2)累计到当前的统计。比如:得到一年中每一个月的累计销售额。
WITH
MEMBER Measures.
[
Additive Internet Sales Amount
]
AS
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 ]
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过去三个月的平均销售额合计。
WITH
MEMBER Measures.
[
Average Internet Sales Amount
]
AS
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 ]
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 ]
http://www.cnblogs.com/pincelee/archive/2007/05/07/737891.html