PowerPivot 层次结构检测 - 活动项目

PowerPivot Hierarchy Detection - Active Projects

基于 Chris Campbell's Article 关于活动项目的内容,我想添加一个额外的维度。我的 table 在非规范化的 2 层层次结构中引用了它们自己的父对象。在调用 RELATED() 函数后,项目的主要查找 table 可能如下所示:

Cases ID | Client | ParentMatterName | MatterName | ClaimAmount | OpenDate | CloseDate 1 | Mr. Smith | ABC Ltd | ABC Ltd | ,000 | 1 Jan 15 | 4 Aug 15 2 | Mr. Smith | ABC Ltd | John | [=11=] |20 Jan 15 | 7 Oct 15 3 | Mr. Smith | ABC Ltd | Jenny | [=11=] | 1 Jan 15 | 20 Jan 15 4 | Mrs Bow | JQ Public | JQ Public | ,000 | 1 Jan 15 | 4 Aug 15

我的目标是确定在给定月份有多少家长小组开放。例如,在 1 月底,将有两个(ABC Ltd 和 JQ public)。要注意的是,我还想报告一段时间内关闭了多少事务。仅当父组中的最后一个事务关闭时才计算关闭(ABC Ltd 为 2015 年 10 月 7 日)。所以我想要的输出是:

| Jan 15 | Aug 15 | Oct 15 Count Matters Open | 2 | 2 | 0 Count Opened | 2 | 0 | 0 Count Closed | 1 | 1 | 1
如何确定?我可以让每一行知道其组中其他人的状态吗?

Count Matters Open:=CALCULATE (
DistinctCount(Cases[ParentMatterName]),
FILTER (
    MatterListView,
    [MatterOpenAtEnd] = TRUE()   ),

不起作用,因为它会计算每个关闭事件和每个未决事件。

所以,您的口头描述似乎与您的输出样本不一致。不过,以下措施可满足您描述的需求,而且更普遍。

基于此要求

Closure would only be counted when the last of the matters in a parent group is closed (7 Oct 2015 for ABC Ltd).

我在 Cases 中添加了两个新字段作为计算列,以指示给定行是否代表父组中第一个打开的问题和一个代表最后一个关闭的问题:

FirstOpened=
IF(
    [OpenDate] =
        CALCULATE(
            MIN('Cases'[OpenDate])
            ,ALLEXCEPT('Cases', 'Cases'[ParentMatterName])
        )
    ,1
    ,0
)

LastClosed:=
IF(
    [CloseDate] =
        CALCULATE(
            MAX('Cases'[CloseDate])
            ,ALLEXCEPT('Cases', 'Cases'[ParentMatterName])
        )
    ,1
    ,0
)

然后我实施了以下措施:

CountMattersOpen:=
CALCULATE(
    DISTINCTCOUNT('Cases'[ParentMatterName])
    ,FILTER(
        VALUES('Cases'[OpenDate])
        ,'Cases'[OpenDate] <= MAX(DimDate[Date])
    )
    ,FILTER(
        VALUES('Cases'[CloseDate])
        ,'Cases'[CloseDate] >= MIN(DimDate[Date])
    )
)

CountOpened:=
CALCULATE(
    DISTINCTCOUNT('Cases'[ParentMatterName])
    ,FILTER(
        VALUES('Cases'[OpenDate])
        ,'Cases'[OpenDate] <= MAX(DimDate[Date])
            && 'Cases'[OpenDate] >= MIN(DimDate[Date])
    )
    ,'Cases'[FirstOpened] = 1
)


CountClosed:=
CALCULATE(
    DISTINCTCOUNT('Cases'[ParentMatterName])
    ,FILTER(
        VALUES('Cases'[CloseDate])
        ,'Cases'[CloseDate] <= MAX(DimDate[Date])
            && 'Cases'[CloseDate] >= MIN(DimDate[Date])
    )
    ,'Cases'[LastClosed] = 1
)

这些适用于任意(连续)日期集,其中日历月代表一小部分。如果您愿意,可以 select 任意两个任意日期之间的时间范围,这些措施仍将正常运作。如果您将月份放在枢轴 table 上,那么它将在每个枢轴 table row/column.

的月份边界上正常工作

请注意,这仅适用于存在日期维度的情况,并且该日期维度必须提供枢轴 table 的 rowfilters/columnfilters。不要在数据透视 rows/columns.

中使用来自案例的任何日期

我们所做的就是使用 FILTER() 遍历构成 Cases[CloseDate] 和 Cases[OpenDate] 的值列表,并过滤掉逻辑上不属于日期上下文的结果pivot table(并根据需要尊重 [FirstOpened]/[LastClosed])

同样,我遵循的是您的书面描述,而不是您的示例输出。

My aim is to determine how many Parent groups were open in a given month.

[CountMattersOpen] 将为您提供在月底之前打开并在月初(或任意时间范围)之后关闭的所有内容。这只计算当前日期上下文中打开的所有内容

[CountOpened] 没有特定的定义,所以我将其与 CountClosed 相反 - 这会计算在当前日期上下文中具有第一个 [OpenDate] 的 [ParentMatterName] 的数量。

Closure would only be counted when the last of the matters in a parent group is closed (7 Oct 2015 for ABC Ltd).

[CountClosed] 为您提供在当前日期上下文中关闭最后一个子 [MatterName] 的不同 [ParentMatterName] 的数量。

这是我的模型图的图像(此处不需要 [BeginningOfMonth] 和 [EndOfMonth]):

消除空白的一种潜在方法是使用 COUNTBLANK 函数,结合 AND:

= IF ( AND ( Cases[CloseDate] = CALCULATE ( MAX ( Cases[CloseDate] ), ALLEXCEPT ( Cases, Cases[ParentName] ) ), CALCULATE ( COUNTBLANK ( Cases[CloseDate] ), ALLEXCEPT ( Cases, Cases[ParentName] ) ) = 0 ), 1, 0 )

虽然该死的复杂,但一定有更好的方法。