zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Java分享笔记:关于Java反射机制
    Java分享笔记:自定义枚举类 & 使用enum关键字定义枚举类
    Java分享笔记:RandomAccessFile流 & 在文件指定位置插入内容
    Spark-源码-SparkContext的初始化
    Spark-源码-Spark-StartAll Master Worler启动流程
    Spark-源码-Spark-Submit 任务提交
    Hadoop2学习路程-HDFS
    JavaSE 第二次学习随笔(五)
    JavaSE 第二次学习随笔(四)
    JavaSE 第二次学习随笔(三)
  • 原文地址:https://www.cnblogs.com/jianjialin/p/2690658.html
Copyright © 2011-2022 走看看