Count函数.
Distinct函数.
existing关键字.
format_String的值
TopCount(exp1, number, exp2): 返回number个exp1集合内 按照exp2降序排序的集合
常用属性函数
使用properties能获取的特性
比如
WITH
MEMBER [Measures].[Parent Member Name] AS
IIF(
[Product].[Product Categories].CurrentMember.Properties
("Level_Number",TYPED)=0,
"Not Applicable",
[Product].[Product Categories].CurrentMember.Parent.Name
)
member [Measures].[lvNum] as [Product].[Product Categories].CurrentMember.Properties
("Level_Number")
SELECT
{([Measures].[Parent Member Name]),[Measures].[lvNum]} ON COLUMNS,
{[Product].[Product Categories].AllMembers} ON ROWS
FROM [Step-by-Step]
solve_order指定计算列的执行顺序
看一个基本的mdx
WITH
MEMBER [Product].[Category].[All Products].[X]AS
([Measures].[Internet Sales Amount],([Product].[Category].[Bikes]))+1
//member [Measures].[totalPecent] as
// [Measures].[Internet Sales Amount]/([Product].[Category].[All Products],[Measures].[Internet Sales Amount])
// ,format_string="percent"
SELECT
{
([Date].[Calendar Year].[CY 2003]),
([Date].[Calendar Year].[CY 2004])
}*
{
[Measures].[Internet Sales Amount]
// ,[Measures].[totalPecent]
}
ON COLUMNS,
{
[Product].[Category].allmembers
} ON ROWS
FROM[Step-by-Step]
如图. 最后一个是Bike的值+1. 而标准的表达式写法 是(作用范围, 度量值).
假设, 我们想知道每个分类的销售额占总的销售额的比例, 应该怎么做. 思考. 增加一个数据列, 被rows打烂的每个单元格是 该单元格的度量值除以总的产品的度量值.
member [Measures].[totalPecent] as
[Measures].[Internet Sales Amount]/([Product].[Category].[All Products],[Measures].[Internet Sales Amount])
,format_string="percent"
[Measures].[Internet Sales Amount] 没有指定作用范围, 因此会被rows的产品给切开. 如果指定了作用域, 比如
([Product].[Category].[All Products],[Measures].[Internet Sales Amount]), 这样就限制得到一个所有产品的汇总. 有了这个汇总值, 我们就可以计算每个分类占所有产品销售量的总额了. 得到计算列如上. 结果如图
看一个例子
这个count函数, 计算的是产品的总数量. 相当于select count(*) from product表. 得到是397个.
这样理解 由于, 这算是个cube外的度量值, 和任何维度(在这里是分类维度)没有任何关系, 因此它没有被分类维度拆开打散.
如果, 我们想得到每个分类的产品个数呢. 使用existing关键字. 它能强制在某一个维度区域上(这里是分类)进行计算.
来看看TopCount, 并且理解一下 域 的概念
WITH
SET [Top 10 Products of 2003] AS
TOPCOUNT(
{[Product].[Product].[Product].Members},
10,
( [Measures].[Internet Sales Amount], [Date].[Calendar Year].[CY 2003])
)
SELECT
{
[Measures].[Internet Sales Amount]
} ON COLUMNS,
{[Top 10 Products of 2003]} ON ROWS
FROM[Step-by-Step]
WHERE ([Date].[Calendar Year].[CY 2004])
;假设我们现在是没有where条件的. 得到是下面的这个结果, 是销量在2003年度前十的产品的总销售额(是数据库内所有的总销售哦, 而不仅仅只是2003年度的. 不过排名确是2003年度的排名).
假如改成这样. 这里得到的是. 数据库销量前十的产品排序. 和上面明显不一样了吧.
OK. 去掉所有的注视. 得到的是. 2003年度销量前十的产品, 在2004年度的销售额..
看. 有些2003年有销售的产品. 在2004年就没有销售了.
如果这个时候. 想增加一列. 显示这些产品的2003年的销售, 作为对比的话呢. 我们思考一下. 应该就是一个(度量值, 时间限定)
得到
同理, 我们想计算一下2003年的销量, 占所有销量的总额也可以增加两个计算列
增加如下
member Measures.sales2003OfAll as
([Measures].[Internet Sales Amount],[Date].[Calendar Year].[CY 2003])/[Measures].[Internet Sales Amount]
,format_string="percent"
最终如下
WITH
SET [Top 10 Products of 2003] AS
TOPCOUNT(
{[Product].[Product].[Product].Members},
10,
( [Measures].[Internet Sales Amount], [Date].[Calendar Year].[CY 2003]
)
)
member Measures.sales2004 as
([Measures].[Internet Sales Amount],[Date].[Calendar Year].[CY 2004])
member Measures.sales2003 as
([Measures].[Internet Sales Amount],[Date].[Calendar Year].[CY 2003])
member Measures.salesAll as
([Measures].[Internet Sales Amount])
member Measures.sales2003OfAll as
// iif(
([Measures].[Internet Sales Amount],[Date].[Calendar Year].[CY 2003])/
([Measures].[Internet Sales Amount],[Date].[Calendar Year])
,format_string="percent"
SELECT
{
Measures.sales2004
, Measures.sales2003
,Measures.salesAll
,Measures.sales2003OfAll
} ON COLUMNS,
{[Top 10 Products of 2003]} ON ROWS
FROM[Step-by-Step]