zoukankan      html  css  js  c++  java
  • mdx 聚合函数

    聚合函数Aggregation(set_express, numeric_express), Aggregationhttp://msdn.microsoft.com/zh-cn/library/ms145524.aspx)执行求和函数, 如果和某些其他求和函数配合的话, 会有变化. 看一个例子

    SELECT
    {
        ([Measures].[Reseller Sales Amount]),
        ([Measures].[Reseller Transaction Count]),
        ([Measures].[Reseller Order Count])
    } ON COLUMNS,
    TopCount(
        {[Product].[Subcategory].[Subcategory].Members},
        5,
        ([Measures].[Reseller Sales Amount])
    ) + 
    {([Product].[Subcategory].[All Products])}
    ON ROWS
    FROM [Step-by-Step]

    很简单. 按销售量排序排名前五的销售小类别的三个值的表现. 第一个是金额, 是sum, 第二个是交易数量, 是count(*), 第三个是distinctCount(*), 订单数量.

    image想增加一行. 汇总一下这前五的信息. 于是, 我们写一个计算列.如下

    因为是添加一行, 那么肯定是用类似于上面的元组+元组. 所以计算列是属于[Product].[Subcategory].元组的. 定义如下

    with 
    member [Product].[Subcategory].[top5] as
        sum(
            topcount([Product].[Subcategory].[Subcategory].Members,
                5,
                [Measures].[Reseller Sales Amount]
                )
            ,[Measures].[Reseller Sales Amount]
            )    

    得到

    image哦, 错了. 这只是得到是Sales Amount一个死的Sum值. 在这里我们忽视了一个东西, CurrentMember, 类似于游标指针似的一个玩意. 它不仅是用在Measures被Dim打乱上(列上被行的打乱), 还可以用在Dim在不同的Measures上的表现, (行被列限定. ).  在这里, colomn上的measures有三个成员. 因此可以用

    image

    这样得到的结果是image可是最后一个值的5026明显不是distinctCount, 而是一个简单是sum运算. 这违背了我们的初衷. 这个时候, 就不能使用简单是sum聚合了. 需要保持原来聚合的Aggregation函数. 最终结果如下

    image

    加一个有趣的东西imageimage

    AVG函数.

    image这样一个简单的东西. 每年的销售额的订单数. 现在我们需要当年的月平均销售额.

    下面我们再来复习一下作用域的概念.

    with 
    member Measures.MonthValue as
        avg(
            [Measures].[Reseller Sales Amount]
            )

    现在是这样. 没有限定任何作用域. 那么这个度量值将会被行维度给打散. 结果如图.

    image这是查询出来了每一年的销售额. 好无聊的操作. 呵呵.

    假设给avg第一个参数赋值, set_express 设置为

    with 
    member Measures.MonthValue as
        avg(
            [Date].[Calendar].[Month].members
            ,
            [Measures].[Reseller Sales Amount]
            )
    相当于得到一个死的值. 已经计算完的.  这个值是所有的月份的销售额之和/月数.

    image, 其实我们需要这个值和每个年份做关联, 被打散. 这个时候, 就需要existing关键字出马了.

    existing强制在当前的区域内做运算. 理解为, 度量值强制在当前的区域内被切割.

    得到image

    这个时候, 突然想到. 其实我们在指定月份的时候, 不也是可以指定他的区域吗?

    比如这样写.

    with 
    member Measures.MonthValue as
        avg(
            ([Date].[Calendar Year].currentmember,[Date].[Calendar].[Month].members),
            [Measures].[Reseller Sales Amount]
            )
    这样限定了. 月份的成员是属于在行的当前的区域范围内. 结果果然是正确得到了和使用existing一样的.
    WITH
    MEMBER [Measures].[Products] AS
    Count(
    EXISTING {[Product].[Product].[Product].Members}
    )
    MEMBER [Measures].[Products List] AS
    Generate(
    EXISTING {[Product].[Product].[Product].Members},
    [Product].[Product].CurrentMember.Name,
    " .. "
    )
    SELECT
    {
    ([Measures].[Products]),
    ([Measures].[Products List])
    } ON COLUMNS,
    {[Product].[Subcategory].Members} ON ROWS
    FROM [Step-by-Step]
    ;

    一个很神奇的东西

    image

  • 相关阅读:
    redis---01
    mysql优化-----索引覆盖
    mysql优化-------Myisam与innodb引擎,索引文件的区别
    mysql优化-----多列索引的左前缀规则
    mysql---列的选取原则
    boogo08---中间件
    goroutine pool,WaitGroup,chan 示例
    Android开发 |常见的内存泄漏问题及解决办法
    Android中FragmentPagerAdapter对Fragment的缓存(二)
    Android中FragmentPagerAdapter对Fragment的缓存(一)
  • 原文地址:https://www.cnblogs.com/jianjialin/p/2694108.html
Copyright © 2011-2022 走看看