MDX 表达式学习笔记

本文详细介绍了MDX表达式中的Count函数、Distinct函数、existing关键字、format_String的值和TopCount函数的使用方法。通过实例展示了如何计算每个分类的销售额占总销售额的比例,并利用TopCount函数获取特定年度销售排名前10的产品。文章还探讨了如何在不同时间范围内比较产品销售情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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年度前十的产品的 

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

转载于:https://www.cnblogs.com/jianjialin/archive/2012/09/18/2690658.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值