Excel formula DAX/PowerPivot查询函数用于在一段时间内分散聚合值

Excel formula DAX/PowerPivot查询函数用于在一段时间内分散聚合值,excel-formula,business-intelligence,powerpivot,cross-join,dax,Excel Formula,Business Intelligence,Powerpivot,Cross Join,Dax,我正在尝试计算DAX表达式[用于Excel 2010中的MS PowerPivot],以便在应用该表达式的范围内均匀分布值的总和,并在给定的时间跨度/时段内重新求和。在SQL server中交叉应用是很简单的,尽管每次尝试都会得到相同的错误结果 我已将MS Project的输出保存为Excel并使用PowerQuery导入/转换,因此开始和结束/结束日期是正确的日期,{X}h和{Y}d是整数,{X}h和{Y}d之间的日历日持续时间已为模型计算/格式化。我还创建了一个dates表,其中包含从第一个

我正在尝试计算DAX表达式[用于Excel 2010中的MS PowerPivot],以便在应用该表达式的范围内均匀分布值的总和,并在给定的时间跨度/时段内重新求和。在SQL server中交叉应用是很简单的,尽管每次尝试都会得到相同的错误结果

我已将MS Project的输出保存为Excel并使用PowerQuery导入/转换,因此开始和结束/结束日期是正确的日期,{X}h和{Y}d是整数,{X}h和{Y}d之间的日历日持续时间已为模型计算/格式化。我还创建了一个dates表,其中包含从第一个日期到最后一个日期的连续日期,以及一个years表,其中包含我要汇总的4位数年份的字符串表示

模型看起来是这样的:

我已经在ResourceQuery、TaskQuery和AssignmentQuery表(全部直接取自MS项目输出)和ServiceAreaQuery(TaskQuery中的唯一值…基本上是子项目)上创建了计算列。每个都有一个简单的度量值,即“分配的小时数”列的总和

数据本身看起来像您期望的Project2010文件,并且有{start_date}、{finish_date}和小时数。任务的日期可以跨越1天到5年……这就是我的问题所在

如何拆分/分块长时间运行任务的预加值,以匹配我要查找的时间间隔

即使我使用date表中的year列,时间智能也无法捕捉到它&对于计算(SUM(FILTER(COUNTROWS(DATESBETWEEN))类型的东西,我已经没有主意了

我试图找出两个中间步骤,但都无济于事。我可以想象,它们都是通过相同的有效功能来解决的,以实现小时、服务区域、资源、年份的最终目标

要显示的透视表

  • 按资源、按年份划分的小时数
  • 按服务区域、按年份划分的小时数
以显示的最终目标

  • 小时数,按服务区域,按资源,按年份
您可以在下面的输出中看到这个问题

请注意,当使用分配的总小时数和AssignmentQuery中的资源名称时,我得到了正确的总和,但当使用任何日期值时……我只得到相对于开始日期的小时数(模型中的活动关系)。我需要的是将这些时间平均分配到它们适用的时间段(因此,如果某个时间段在1/1/16和1/1/19之间有1000个小时,我预计每年会显示333个小时)

我最初的想法是选择器/过滤器/计算函数需要执行以下操作:

  • 选择该人员的工作时间
  • 从筛选器或列标题中选择筛选到的期间中的天数(例如月/年/季度/任意日期)
  • 计算每天的小时数
  • 获取筛选周期中的工作日
  • 从重叠中选择小时数的总和
任何想法都非常感谢!作为PowerQuery的一个步骤,我愿意做一些额外的ETL/数据创建,但我真的很想找出适合这个步骤的DAX表达式,这样它就可以作为项目上的时间切片器/过滤器

提前谢谢

**编辑以发布所提供答案的修订版本**

[Hours Apportioned Raw] :=
DIVIDE (
    CALCULATE (
                [Hours],
                FILTER (
                    AssignmentQuery,
                    AssignmentQuery[Start_Date] <= MAX ( Dates[Date] )
                        && AssignmentQuery[Finish_Date] >= MAX ( Dates[Date] )
                        )
                )
    , ( COUNTROWS (
                    DATESBETWEEN ( 
                                    Dates[Date]
                                    , FIRSTDATE ( AssignmentQuery[Start_Date] )
                                    , LASTDATE ( AssignmentQuery[Finish_Date] )
                                 )
                  )
      )
)
[原始分配小时数]:=
分开(
算计(
[小时],
滤器(
转让查询,
AssignmentQuery[开始日期]=最大值(日期[日期])
)
)
,(COUNTROWS)(
日期介乎(
日期[日期]
,FIRSTDATE(AssignmentQuery[开始日期])
,LASTDATE(AssignmentQuery[完成日期])
)
)
)
)

考虑到您有一个相对复杂的模型,并且您的需求并不完全简单,我不确定这是否能让您一直做到这一点,但希望它至少能激励您根据自己的目的修改模型,或者开始更详细的讨论

以下措施有效地将小时相加,将其应用于日期介于开始和结束之间的日期,并将总数除以天数。稍微复杂的是,这需要在包含小时数的表中的日期和行上迭代一次

您可能会遇到一个问题,我使用的是一个未连接的日期表,如果您无法在模型中复制这种情况,那么我们需要尝试使用一些ALL()函数

下面的解决方案假设一个名为“data”的表有4列:id、开始、结束、值,一个名为calendar的表有2列Date和Month

措施1:计算小时数

[Hours] =SUM(Data[Value])
措施2:将小时数应用于日期并除以日期数

[Hours Apportioned Raw] =
 CALCULATE ([Hours],
FILTER (
    Data,
    Data[Start] <= MAX ( Calendar[Date] )
        && Data[END] >= MAX ( Calendar[Date] )
       )
            )
/ ( MAX ( Data[End] ) - MAX ( Data[Start] ) )
希望这是有意义的,非常简单的测试模型:


注意:您需要下载模型,而不仅仅是在浏览器中查看它。

Brilliant-必须做一些小的更改,以说明某些东西可以在同一天开始和结束(通过减法返回天数为零)&&如果在这段时间内没有工作,用一个除法来防止被零除,但是你让我做到了。非常感谢。我会把更新的版本放在我的问题里。太棒了,很高兴能帮上忙!请将其标记为答案:-)
=
    SUMX (
        VALUES ( Calendar[Date] ),
        SUMX ( VALUES ( Data[ID] ), [Hours Apportioned RAW] )
    )