在我的日期维度中,我有2个层次结构:
[年 - 周 - 日期] 和 [年 - 月 - 日期]
如果日期维度的当前级别为[日期](最低级别)或更高级别,我想检查多维数据集计算。
我怎样才能做到这一点?
背景:我需要这个来计算一个员工在一个时期内的工作天数。 我目前有这个代码(未经测试)应该为1个层次结构做技巧,但我想当用户使用[年 - 周 - 日]层次结构时,这将失败。
CASE WHEN
[Date].[Year - Month - Date].CURRENTMEMBER.Level
IS
[Date].[Year - Month - Date].[Date]
THEN
//at day level,
//if there is any duration booked, this is a working day
IIF([Measures].[Duration] = 0,0,1)
ELSE
//at higher than day level,
//count days
COUNT(
// where duration > 0 (employee work day)
FILTER(
Descendants([Date].[Year - Month - Date].CURRENTMEMBER, [Date].[Year - Month - Date].[Date]),
[Measures].[Duration] > 0
)
)
END
tl; dr 如何使上述代码尽可能以最干净的方式适用于[年 - 周 - 日]层次结构。
答案 0 :(得分:2)
让我们假设层次结构(又名属性)[日期]。[日期]存在。如果是这种情况,您可以简化:
COUNT(
FILTER( Existing [Date].[Date].members, [Measures].[Duration] > 0 )
)
Existing将强制在[日期]维度上应用自动存在。这主要是性能提升,因为它无法评估(事实上)所有元组。
一旦前面的示例清楚,我们可以将它与您的版本合并,以获得最快的解决方案(不需要第一个iif):
COUNT(
FILTER( Existing
Descendants([Date].[Year - Month - Date].CURRENTMEMBER, [Date].[Year - Month - Date].[Date],self)
, [Measures].[Duration] > 0 )
)
可以进一步改进添加具有不同聚合类型的新度量或添加iif以更改两个层次结构中的哪一个用于后代(例如,当前成员和默认成员不相等的那个)
答案 1 :(得分:1)
如果您正在寻找最简洁的方法来计算一段时间内的工作日数,您必须模拟常规测量的行为。否则,如果在[日期]上进行多重选择,您将收到错误或错误数据。另外,希望摆脱Count(Filter(...))表达式以保持块计算模式(参见Optimizing Count(Filter(...)) expressions in MDX)。为此,请按照下列步骤操作:
在MDX脚本中写入:
(
[Date].[Date].[Date].Members,
[Measures].[Working days]
) = Iif( [Measures].[Duration] > 0, 1, null );
答案 2 :(得分:1)
IsLeaf()
会告诉您会员是否在底层。
答案 3 :(得分:0)
在计算脚本中查看SCOPE命令,我为YMD日历和YWD日历做了类似的事情:
CREATE MEMBER CurrentCube.Measures.Example AS NULL //Dummy will be calc'd later
SCOPE (DESCENDANTS([Date].[Calender Y M D],,AFTER));
Measures.Example = 1; //Fill in for monthly calcs
END SCOPE
SCOPE (DESCENDANTS([Date].[Calender Y W D],,AFTER));
Measures.Example = 2; //Fill in for weekly calcs
END SCOPE
如果我记得正确的话,使用,, AFTER的语法是排除所有成员,我正在尝试将链接扩展但无法找到它。或者,如果计算适用于ALL成员,则只需使用SCOPE([Date].[Calender Y W D])