2017-02-02 47 views
2

我有以下已简化了一点情况的项目持续时间(天):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,用户只想查看9月应该只显示30天。

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

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

编辑:这里是一个图片来解释这更好:

enter image description here

更新2017年2月7日

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

更新2017年2月9日

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

+0

您是否需要计算开始日期和结束日期之间的天数,或者您需要计算它们之间的成本?你可以编辑你的问题,包括基本的样本数据和预期的结果。 –

+0

开始和结束日期之间的持续时间(如果上下文未被其他日期过滤)。我将添加数据。 – Henri

回答

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 hereenter 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

尽管这种解决方案在电力BI的实例阐述它在电力 枢轴了。

让我知道这是否有帮助。

+0

我忘了提,但是这个解决方案是用SQL Server 2014 CU1 SSAS开发的。看起来我们没有DATEDIFF或MAX,但有多个值。 – Henri

+0

@亨利,我已经更新了我的答案,以替代DATEDIFF缺乏在SSAS 2014年。也DAX措施包裹在一个。希望能帮助到你。 –

1

首先我想创建2间的关系:

  1. project_dim [project_key] => costs_fact [project_key]
  2. DATE_DIM [日期] => costs_fact [日期]

的成本措施将只是:SUM(costs_fact [成本])

Duration(天数)度量需要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]) 
    ) 
) 
+0

很好的回答!这是我自己摆弄自己的东西,但没有技巧/知识去拉取正确的形式来衡量。您是否认为我们可以使用DISTINCTCOUNT(costs_fact [project_key])多个当前结果,以便在查找没有项目过滤器的月度项目日期时显示所有项目的日期? – Henri

+0

您首先需要像Alejandro的回复中描述的“项目计数”度量。 –

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

相关问题