DAX度量:项目持续时间(天)从维度开始&结束日期

时间:2017-02-02 15:36:34

标签: powerbi powerpivot dax

我有以下方案已经简化了一点:

费用事实表:

date, project_key, costs €

项目维度:

project_key, name, starting date, ending date

日期维度:

date, years, months, weeks, etc

我需要创建一个度量,使用项目维度的开始和结束日期来告诉项目的持续时间。 第一个挑战是事实表中的所有日期都没有交易。项目开始日期可能是1月1日,但第一次成本交易是在1月15日的事实表上。因此,如果在过滤器上下文中,我们仍需要计算开始日期和结束日期之间的天数。

所以第二个挑战是过滤器上下文。用户可能只想查看二月。所以它的项目开始日期是1.6.2016,结束日期是1.11.2016,用户只想查看它应该只显示30天。

第三个​​挑战是查看多个项目的日期。因此,如果用户只选择一天,它应该查看正在进行的所有项目的计数。

我感谢任何可能导致解决方案的帮助。因此,如果需要,请不要犹豫,询问更多细节。

编辑:这是一张更好地解释这一点的图片:

enter image description here

更新7.2.2017

仍尝试为此解决方案创建单个度量。衡量哪些用户只能使用日期,项目或原样。对于每天正在进行的项目计数,单独计算的列将是简单的解决方案,但它只会按日期表进行过滤。

更新9.2.2017

谢谢大家的努力。作为最终结果,我确信不基于事实表的计算非常棘手。对于这个特定情况,我最终在日期和项目ID上使用CROSS JOIN创建新表以满足所有要求。一种选择是将开始日期和结束日期作为自己的行添加到事实表中,且成本为零。真正的解决方案还需要考虑更多维度。

3 个答案:

答案 0 :(得分:3)

要获得预期结果,您必须创建计算列和度量,计算列可以计算执行项目的日期中的项目数以及计算[starting_date]过去天数的度量每个项目中的[ending_date]都会考虑过滤器。

必须使用以下表达式在dim_date表中创建计算列:

Count of Projects =
SUMX (
    FILTER (
        project_dim,
        [starting_date] <= EARLIER ( date_dim[date] )
            && [ending_date] >= EARLIER ( date_dim[date] )
    ),
    1
)

应使用以下表达式在project_dim表中创建度量:

Duration (Days) =
DATEDIFF (
    MAX ( MIN ( [starting_date] ), MIN ( date_dim[date] ) ),
    MIN ( MAX ( [ending_date] ), MAX ( date_dim[date] ) ),
    DAY
)
    + 1

您将得到的结果如下:

enter image description here enter image description here

如果您使用dim_date

上的切片器或过滤器过滤周

enter image description here

更新支持SSAS 2014 - DATEDIFF()可在SSAS 2016中使用。

首先,您必须意识到自己正在测量两种不同的东西,但您只希望用户看到一种衡量标准。在第一个预期结果中,您希望获得每个日期中运行的项目数,而在预期结果2和3(在OP中)中,您希望每个项目中经过的天数都考虑date_dim上的帐户过滤器。 / p>

您可以创建一个度量来将两个度量包装在一个中,并使用HASONEFILTER来确定每个度量应该运行的上下文。在继续包装措施之前,请使用DATEDIFF功能检查以下措施,以取代上面发布的措施,该功能在您的环境中无效。

创建确定每个日期中项目数量所需的上一个计算列后,创建一个名为Duration Measure的度量,此度量不会被您的用户使用,但让我们计算最终结果测量

Duration Measure = SUMX(FILTER (
        date_dim,
        date_dim[date] >= MIN ( project_dim[starting_date] )
            && date_dim[date] <= MAX ( project_dim[ending_date] )
    ),1
)

现在,您的用户应该进行交互的最终衡量标准可以这样写:

Duration (Days) =
IF (
    HASONEFILTER ( date_dim[date] ),
    SUM ( date_dim[Count of Projects] ),
    [Duration Measure]
)

此度量将确定上下文,并将返回给定上下文的正确度量。因此,您可以为两个表添加相同的度量,它将返回所需的结果。

enter image description here

  

尽管这个解决方案在Power BI中得到了证明,但它仍适用于Power   也支持。

如果有帮助,请告诉我。

答案 1 :(得分:1)

首先,我会创建2个关系:

  1. project_dim [project_key] =&gt; costs_fact [project_key]
  2. date_dim [date] =&gt; costs_fact [日期]
  3. 成本衡量标准只是:SUM(costs_fact [costs])

    持续时间(天)度量需要一个CALCULATE来更改Date维度上的过滤器上下文。这有效地根据两个表中选定的行计算project_dim和date_dim之间的关系。

    Duration (days) =
    CALCULATE (
        COUNTROWS ( date_dim ),
        FILTER (
            date_dim,
            date_dim[date] >= MIN ( project_dim[starting_date] )
                && date_dim[date] <= MAX ( project_dim[ending_date] )
        )
    )
    

答案 2 :(得分:1)

我建议您将度量Project (days)分成不同的计算列/度量,因为它们实际上在不同的上下文中具有相同的含义。

首先,在日期/成本和项目/成本之间创建一对多关系。 (注意在计算过程中将错误地应用单个交叉滤波器方向或滤波器上下文)

relationship

对于预期结果1,我在名为Project (days) = COUNTROWS( FILTER( projects, dates[date] >= projects[starting_date] && dates[date] <= projects[ending_date] ) ) 的日期维度中创建了一个计算列。它计算某一天有多少项目正在进行中。

Project (days)

Project (days)

P.S。如果您希望每周/每月汇总结果,则可以进一步创建度量并汇总Duration (days)

对于预期结果2和3,度量Duration (days) = COUNTROWS( FILTER( dates, dates[date] >= FIRSTDATE(projects[starting_date]) && dates[date] <= FIRSTDATE(projects[ending_date]) ) ) 如下:

xCode 8.0

结果将符合预期: result 1 result 2