首页 文章

DAX指标:从维度开始和结束日期开始的项目持续时间(天)

提问于
浏览
2

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

Costs fact table:

date, project_key, costs €

Project dimension:

project_key, name, starting date, ending date

Date dimension:

date, years, months, weeks, etc

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

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

第三个挑战是查看多个项目的日期 . 因此,如果用户仅选择单日,则应查看正在进行的所有项目的计数 .

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

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

enter image description here

Update 7.2.2017

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

Update 9.2.2017

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

3 回答

  • 1

    要获得预期结果,您必须创建计算列和度量,计算列可以计算执行项目的日期中的项目数,以及计算每个项目中 [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

    UPDATE 支持SSAS 2014 - DATEDIFF()在SSAS 2016中可用 .

    首先,重要的是你要意识到你正在测量两种不同的东西,但是你只想让用户看到一种尺寸 . 在第一个预期结果中,您希望获得在每个日期中运行的项目数,而在预期结果2和3(在OP中)中,您希望每个项目中的日期都在 date_dim 上的帐户过滤器中 .

    您可以创建一个度量来将两个度量包装在一个中,并使用 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 Pivot .

    如果这有帮助,请告诉我 .

  • 3

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

    • project_dim [project_key] => costs_fact [project_key]

    • date_dim [date] => costs_fact [date]

    成本度量将是:SUM(costs_fact [成本])

    持续时间(天)度量需要一个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] )
        )
    )
    
  • 1

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

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

    relationship

    对于预期结果1,我在日期维度中创建了一个名为 Project (days) 的计算列 . 它计算某一天有多少项目正在进行中 .

    Project (days) = 
    COUNTROWS(
        FILTER(
            projects,
            dates[date] >= projects[starting_date] &&
            dates[date] <= projects[ending_date]
        )
    )
    

    Project (days)

    附:如果你想拥有每周/每月汇总结果,您可以进一步创建一个度量并汇总 Project (days) .

    对于预期结果2和3,度量 Duration (days) 如下:

    Duration (days) = 
    COUNTROWS(
        FILTER(
            dates,
            dates[date] >= FIRSTDATE(projects[starting_date]) &&
            dates[date] <= FIRSTDATE(projects[ending_date])
        )
    )
    

    结果将如预期:
    result 1

    result 2

相关问题