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)
最终按层次展开效果,如下图