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

时间:2015-10-05 21:26:04

标签: hierarchy powerpivot dax

建立在Chris Campbell's Article关于有效项目的基础上,我想添加一个额外的维度。我的表在非规范化的2层层次结构中引用它们自己的父事项。在调用RELATED()函数之后,项目的主查找表可能如下所示:

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

我的目标是确定在一个月内有多少家长组开放。例如,在1月底,将有两个(ABC Ltd和JQ public)。问题是,我还想报告在一段时间内关闭了多少事项。只有当母公司集团的最后一项事项关闭时(2015年10月7日为ABC有限公司),才会计算关闭。所以我想要的输出是:

| 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()   ),

不起作用,因为它会计算每个闭包以及每个开放物质。

2 个答案:

答案 0 :(得分:1)

因此,您的口头描述似乎与您的输出样本不一致。以下措施适用于您描述的需求,更常见的是。

基于此要求

  

关闭只会在母公司集团的最后一项事项结束时计算(2015年10月7日为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
)

这些适用于任意(连续)日期集,其中日历月代表一小部分。如果您愿意,可以选择任意两个任意日期之间的时间范围,这些措施仍然可以正常运行。如果您已将数月放入数据透视表,那么它将适用于每个数据透视表行/列的月边界。

请注意,这仅适用于日期维度的存在,并且该日期维度必须提供数据透视表的rowfilters / columnfilters。不要在数据透视表行/列中使用案例中的任何日期。

我们所做的就是使用FILTER()逐步完成组成Case [CloseDate]和Cases [OpenDate]的值列表,并过滤掉那些逻辑上不属于日期上下文的结果。数据透视表(并根据需要尊重[FirstOpened] / [LastClosed])

同样,我已经按照你的书面描述,而不是你的样本输出。

  

我的目标是确定在一个月内有多少家长组开放。

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

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

  

关闭只会在母公司集团的最后一项事项结束时计算(2015年10月7日为ABC Ltd)。

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

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

enter image description here

答案 1 :(得分:0)

抵消空白的一种可能方法是使用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 )

但是,该死的复杂,必须是更好的方式。