0

在我的日期维度中,我有 2 个层次结构:

[年-周-日][年-月-日]

如果日期维度的当前级别是 [日期](最低级别)或更高级别,我想检查多维数据集计算。

我怎样才能做到这一点?

背景:我需要这个来计算员工在一段时间内有多少工作日。我目前有这个代码(未经测试)应该可以解决 1 个层次结构的问题,但我想当用户使用 [Year - Week - Date] 层次结构时这会失败。

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;博士我如何以最简洁的方式使上述代码也适用于 [Year - Week - Date] 层次结构。

4

4 回答 4

2

让我们假设层次结构(又名属性)[Date].[Date] 存在。如果是这种情况,您可以简化:

  COUNT(
    FILTER( Existing [Date].[Date].members, [Measures].[Duration] > 0 )
  )

Existing将强制在 [Date] 维度上应用自动存在。这主要是一种性能改进,因为它避免了评估(事实检查)所有元组。

一旦前面的例子清楚了,我们可以将它与您的版本合并以获得最快的解决方案(不需要第一个 iif):

  COUNT(
    FILTER( Existing 
       Descendants([Date].[Year - Month - Date].CURRENTMEMBER, [Date].[Year - Month - Date].[Date],self) 
       , [Measures].[Duration] > 0 )
  )

进一步的改进可能是添加具有不同聚合类型的新度量或添加 iif 以更改两个层次结构中的哪一个用于后代(例如 currentmember 和 defaulmember 不相等的那个)

于 2011-07-05T10:00:15.913 回答
1

IsLeaf()将告诉您成员是否处于底层。

于 2011-08-07T17:23:18.803 回答
1

如果您正在寻找最简洁的方法来计算一段时间内有多少个工作日,您必须模仿常规测量的行为。否则,如果在 [日期] 上进行多选,您将收到错误或错误数据。此外,最好去掉 Count(Filter(...)) 表达式以保持块计算模式(请参阅优化 MDX 中的 Count(Filter(...)) 表达式)。为此,请按照下列步骤操作:

  1. 转到数据源视图。
  2. 在 [Duration] 列(在同一个事实表中)旁边创建一个新的命名计算。
  3. 列名是“工作日”,表达式是“空”。
  4. 根据“工作日”列创建新的常规度量。聚合函数是 Sum。
  5. 在 MDX 脚本中编写:

    (
        [Date].[Date].[Date].Members,
        [Measures].[Working days]
    ) = Iif( [Measures].[Duration] > 0, 1, null );
    
于 2011-07-06T07:16:45.523 回答
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 成员,我正在尝试区分链接但找不到它。或者,如果计算适用于 ALL 成员,只需使用SCOPE([Date].[Calender Y W D])

于 2011-07-05T10:08:39.890 回答