4

我正在尝试计算 DAX 表达式 [for MS PowerPivot in Excel 2010] 以将值的总和均匀分布在它所应用的范围内,并在给定的时间跨度/周期内重新求和。在 SQL Server 中交叉应用是微不足道的,尽管每次尝试都会得到相同的错误结果。

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

该模型如下所示:

PowerPivot 模型

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

数据本身看起来就像您对 Project 2010 文件所期望的一样,并且具有 {start_date}、{finish_date} 和小时数。一项任务的日期可以从 1 天到 5 年不等……这就是我的问题所在。

如何拆分/分块长时间运行的任务的预求和值以匹配我正在寻找的时间间隔?

即使我使用日期表中的年份列,时间智能也无法捕捉到它,而且我对CALCULATE(SUM(FILTER(COUNTROWS(DATESBETWEEN))))类型的东西的想法已经用完了。

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

要显示的数据透视表

  • 按资源的小时数,按年
  • 按服务区域的小时数,按年

为了显示最终目标

  • 小时,按服务区域,按资源,按年

您可以在下面的输出中看到问题。

错误输出示例

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

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

  • 选择人员的营业时间
  • 从过滤器或列标题中选择过滤到(例如月/年/季度/任何)期间的天数
  • 计算每天的小时数
  • 获取过滤周期内的工作日
  • 从重叠中选择小时的总和

任何想法都非常感谢!我愿意做一些额外的 ETL/数据创建作为 PowerQuery 步骤,但我真的很想为此找出正确的 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] )
                                 )
                  )
      )
)
4

1 回答 1

6

鉴于您有一个相对复杂的模型,并且您的要求并不完全简单,我不确定这是否会让您一路走好,但希望它至少会给您灵感来为您的目的修改它,或者开始更详细的讨论。

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

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

下面的解决方案假设一个名为“数据”的表有 4 列:id、开始、结束、值和名为日历的表,它有 2 列日期和月份。

措施 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] ) )

措施 3:在日期和 ID 上迭代措施 2 以提供正确的值

=
    SUMX (
        VALUES ( Calendar[Date] ),
        SUMX ( VALUES ( Data[ID] ), [Hours Apportioned RAW] )
    )

希望这有一些意义,这里非常简单的测试模型:测试模型

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

于 2014-09-10T11:47:34.980 回答