zoukankan      html  css  js  c++  java
  • MDX之Avg函数使用

    日均值是比较常见的指标,本文对 MDX 计算日均值做一个总结

    MDX 计算日均值,表达式一

    WITH MEMBER Measures.[日均值] AS
       Avg(
          Descendants(
             [日期].[日期层次].CurrentMember, 
                [日期].[日期层次].[日期]
          ), 
          Measures.[主帖数]
       )
       ,Format_String = "#,##0"
    SELECT
        Measures.[日均值] ON COLUMNS,
           [日期].[日期层次].[月份] ON ROWS
    FROM
       [forum]

    上面的代码使用 Descendants 获得在当前层次上的所有日期集合

    然后使用 avg 函数取得平均值

    MDX 的 Descendants 函数返回成员在指定级别或距离上的后代集,

    可以选择包括或不包括其他级别上的后代。

    Descendants 函数是 MDX 里最复杂的函数之一,搞懂它就真正了解了维度层次。

    Descendants 说明

    http://msdn.microsoft.com/zh-cn/library/ms146075.aspx

    avg 函数说明

    http://msdn.microsoft.com/zh-cn/library/ms146067.aspx

    结果如下

    特别要注意,计算季度日均值时,是季度指标/季度日期数,不能用月的日均值除以3。

    这就是一种所谓半累加行为,参考说明见本文结尾。

    层次结构展示


    仔细看一下,上述结果有些问题


    原来因为有几天没有帖子数, 而 avg 函数是不计算空值的。

    修改一下 mdx 的计算方法,先 sum 再除以 count

    WITH MEMBER Measures.[日均值] AS
       sum(
          Descendants(
             [日期].[日期层次].CurrentMember, 
                [日期].[日期层次].[日期]
          ), 
          Measures.[主帖数]
       )/ Descendants(
             [日期].[日期层次].CurrentMember, 
                [日期].[日期层次].[日期]
          ).count
       ,Format_String = "#,##0"
    SELECT
        { Measures.[日均值]} ON COLUMNS,
           Descendants(
             [日期].[日期层次].CurrentMember, 
                [日期].[日期层次].[月份]
          ) ON ROWS
    FROM
       [forum]   
       where [日期].[月份].&[2004-06-01T00:00:00]

    得出正确结果:

    重新看了一下 avg 函数说明,发现配合 CoalesceEmpty 函数可以包含空值

    标准的写法

    WITH MEMBER Measures.[日均值] AS
       avg(
          Descendants(
             [日期].[日期层次].CurrentMember, 
                [日期].[日期层次].[日期]
          ), 
         CoalesceEmpty( Measures.[主帖数],0)
       )
       ,Format_String = "#,##0"
    SELECT
        { Measures.[日均值]} ON COLUMNS,
           Descendants(
             [日期].[日期层次].CurrentMember, 
                [日期].[日期层次].[月份]
          ) ON ROWS
    FROM
       [forum]   
       where [日期].[月份].&[2004-06-01T00:00:00]

    CoalesceEmpty 函数说明

    http://msdn.microsoft.com/zh-cn/library/ms146080.aspx

    如果能保证值都为非空或者本来就不需要包含空值,可以在 ssas 里直接把度量聚合函数

    设为 AverageofChildren,完全不用写 MDX。计算结果同 MDX 表达式一

    AverageofChildren 是半累加的一种,参考说明

    SSAS 中的半累加聚集类型 (Semi-Additive Aggregation Type)

    最终按层次展开效果,如下图


  • 相关阅读:
    [dubbo实战] dubbo+zookeeper伪集群搭建
    Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
    Docker实践
    docke镜像上传到dockerhub仓库和阿里云docker仓库的方法
    Linux chmod命令详解
    使用nexus搭建maven私服
    Zookeeper注册节点的掉线自动重新注册及测试方法
    Dubbo负载均衡策略
    各种排序算法及其java程序实现
    java中的各种数据类型在内存中存储的方式
  • 原文地址:https://www.cnblogs.com/ycdx2001/p/3290791.html
Copyright © 2011-2022 走看看