MDX 表达式学习笔记


Count函数.

Distinct函数.

existing关键字.

format_String的值

TopCount(exp1, number, exp2): 返回number个exp1集合内 按照exp2降序排序的集合

image

常用属性函数

image

使用properties能获取的特性

image

image

比如

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]
image

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]
image

如图. 最后一个是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]),  这样就限制得到一个所有产品的汇总.   有了这个汇总值, 我们就可以计算每个分类占所有产品销售量的总额了. 得到计算列如上.  结果如图

image.

 

看一个例子

image.

这个count函数, 计算的是产品的总数量. 相当于select count(*) from product表. 得到是397个.

这样理解 由于, 这算是个cube外的度量值, 和任何维度(在这里是分类维度)没有任何关系, 因此它没有被分类维度拆开打散.

如果, 我们想得到每个分类的产品个数呢.  使用existing关键字. 它能强制在某一个维度区域上(这里是分类)进行计算.

image这样就不一样了.  得到我们想要的结果.

 

 

来看看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年度的排名). 

image

假如改成这样image.  这里得到的是. 数据库销量前十的产品排序. 和上面明显不一样了吧.

image

 

OK. 去掉所有的注视. 得到的是. 2003年度销量前十的产品, 在2004年度的销售额..

image看. 有些2003年有销售的产品. 在2004年就没有销售了.

 

如果这个时候. 想增加一列. 显示这些产品的2003年的销售, 作为对比的话呢. 我们思考一下. 应该就是一个(度量值, 时间限定)image

得到

image

同理, 我们想计算一下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]

 

image


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM