日均值是比较常见的指标,本文对 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)

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

最新文章

  1. IIS6.0添加上.net4.0后,以前的.net系统出现“服务器应用程序不可用”的错误提示解决办法
  2. 得到设备是何种iPhone设备 + 怎么获得启动页面图片
  3. 【QT】ui转代码
  4. Android 文件夹命名规范 国际化资源
  5. HAL层Camera模块Dump图片--工作积累
  6. C语言基础--while循环
  7. Ubuntu Nginx搭建Gitweb服务器
  8. C#语法需要注意的地方
  9. Android之最简单的ImageView加边框方法
  10. android merge 标签的使用
  11. Js之Location对象
  12. 在线协作沟通工具DesignBoard帮助设计团队更有效地进行沟通与版本管理
  13. JSP入门 taglib
  14. Java泛型范例
  15. Git请求合并说明
  16. matplot画图kill问题,形成思路
  17. Jetbrains IntelliJ IDEA PyCharm 注册激活(2018最新)
  18. BZOJ 5306 [HAOI2018] 染色
  19. 单节点etcd配置
  20. winform程序开机自动启动

热门文章

  1. python多进程执行任务
  2. 实用jQuery代码片段
  3. codeforces C. Cows and Sequence 解题报告
  4. phpcms 内容模块PC标签调用
  5. 盈创动力之 JS校验方法
  6. python 快速排序 qsort
  7. OJ提交题目中的语言选项里G++与C++的区别
  8. codeforces 701D D. As Fast As Possible(数学)
  9. multi_socket
  10. 初始化cache_dir(squid)