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,那么你实际上有 numeric
s 或整数以外的东西。
如果要在 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]
我有一个事实 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,那么你实际上有 numeric
s 或整数以外的东西。
如果要在 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]