MDX - 整个时间段的平均值,即使没有数据存在

MDX - Average over the whole time period, even when no data exists

我有一个事实 table,每天 1 行。示例:

ID  Date     Value
1   20190101 10
1   20190102 15
2   20190101 31

如果我在 SSAS 立方体中取一个简单的平均值,我得到:

ID Average <Formula>
1  12.5    (10+15)/2
2  15.5    31/2

据我所知,15.5 是因为范围内总共有 2 天,因为当我 select 整个月时,事实数据中只有两天存在。

但是,我需要计算 每月 平均值。它应该检查该月是否有 31 天(基于日期维度)并得到以下结果:

ID Average <Formula>
1  0.8     (10+15)/31
2  1       31/31

到目前为止,我已尝试创建一些 "fake rows" 如果我的数据,例如,我已尝试为 ID=1 的日期 20190103-20190131 创建值 = 0 的行。

这行得通,它强制 ID=1 的计算始终占用该期间的所有天数,但它打乱了我在多维数据集中的其他计算。

是否有任何其他方法强制 SSAS 多维立方体中的平均值计算始终计算整个月?

我会推荐:

select id, eomonth(date) as eom,
       sum(value) * 1.0 / day(eomonth(date)) as average
from t
group by id, eomonth(date);

EOMONTH() returns 该月的最后一天。您可以提取日期以获取该月的天数。

* 1.0是因为SQL服务器做整数除法。你的数字看起来像整数,但如果你得到 15.5,那么你实际上有 numerics 或整数以外的东西。

如果要在 Cube 中进行计算,可以在 Date 维度上使用 Descendants 函数

例如,下面使用 AdventureWorks 样本

给出一个月中的天数
WITH MEMBER Measures.DayCount AS 
    Descendants
    ( 
        [Date].[Calendar].CurrentMember,   
        [Date].[Calendar].[Date],
        LEAVES  
    ).Count

SELECT [Measures].[DayCount] ON 0,
        [Date].[Calendar].[Month].ALLMEMBERS ON 1 
FROM [Adventure Works]