【问题标题】:Drill Down % Calculation Adjust to Context - Date/Calendar向下钻取百分比计算调整到上下文 - 日期/日历
【发布时间】:2018-09-27 23:10:33
【问题描述】:

我是 PowerBI 的新手。这可能超出了我的想象,我很难理解上下文/过滤器以及它们如何与其他嵌套过滤器一起工作。无论如何,这是我的问题。

我正在尝试创建一份报告,显示一个计划的收费小时数与标准员工的总工作小时数相比。我创建了一个公司日历,其中包含一年中的所有日子以及它们是否是工作日。我有一个“小时”列,如果是工作日,则其中包含 8,如果是假期或周末,则为 0。

这通常称为 FTE 或全职等效人员。

我的问题是,在向下和向上钻取时,我的总数得到不同的值。这似乎是由于矩阵表的上下文。当它在一年的“总”上时,它使用了一个工作年所包含的全部 2000 小时,而实际上只有 1600 小时左右,因为现在只有 9 月。

为了解决这个问题,我尝试编写以下公式,但它也没有按预期工作。如果有更简单的方法来解决这个问题或者我应该采取什么方法。似乎无法在其他帖子中找到答案。

基本上,当我处于 2018 年级别时,我希望它是“2018 年总实际小时数/YTD 2018 年总校准小时数”。当它在 Qtr 上时,我希望它是“2018 年第 1 季度总实际小时数/2018 年第 1 季度总小时数”。当它深入到月时,我希望它是“2018 年 1 月总实际小时数/2018 年 1 月总卡尔小时数”。

谢谢。

表格示例

校准表

Date        Holiday  Hours
01/01/2018  Yes      8
01/02/2018  No       8
...
...

收费表小时数

EmpID    Name    Project   Date          Hours
1234     Bryan   123454.1  01/22/2018    2.3
1111     Steve   123456.1  01/15/2018    2.8
0156     Stu     123483.1  01/10/2018    2.8
...
...

公式

FTE By Drill =
VAR Actual Hours = Sum(Timesheet[Hours])
VAR Cal Hours = Sum(Calendar[Hours])

      Actual Hours / IF(
                        ISFILTERED('Calendar'[Date].[year]),
                        TOTALYTD([Cal Hours],'Calendar'[Date]),
                        IF(
                            ISFILTERED('Calendar'[Date].[Quarter]),
                            TOTALQTD([Cal Hours],'Calendar'[Date]),
                            IF(
                                ISFILTERED('Calendar'[Date].[Month]),
                                TOTALMTD([Cal Hours],'Calendar'[Date])
                                ,0)
                        )
        )

【问题讨论】:

    标签: powerbi dax powerpivot


    【解决方案1】:

    当您使用 VAR 时,您实际上是在设置它。一旦您将其称为 VAR,它就不会发生变化,因为它对上下文变化敏感。您也过多地使用 IF(您说您是 DAX 新手,这是 2 个经典错误)。 您要做的是获取实际小时数的百分比。在 DAX 中,您将使用 SUMMARIZE 获取度量值,然后对其进行额外计算。

    现在您知道 VAR 的工作原理了。

    在 DAX 中,您处理 TOTALS。如果您的 DimDate 表有一个“已经”字段,您可以使用它,按 2018 年过滤,SUMMARIZE 当月的小时数以及工作小时数。看看那张桌子,看看那里有什么。现在您可以计算工作百分比。

    代码 sn-p 仅包含以下几行:

    SELECTCOLUMNS ("WorkPercent", WorkHous/ActualHous
    SUMMARIZECOLUMNS (
    FILTER ("WorkHours", [WORKHOURS], 
    "ActualHours", [Actual hours worked], 
    DimDate[Year] = 2018 && HasBeen = TRUE))
    

    【讨论】:

    • 感谢您的评论。这需要一些时间来消化。如果我找到解决方案,我会阅读并回复您。
    【解决方案2】:

    我建议您在计费时间表(时间表)中创建一个计算列,用于存储每个日期的日历小时数。像这样:

    Cal Hours = LOOKUPVALUE(Calendar[Hours],'Calendar'[Date],Timesheet[Date])
    

    或者,当两个表之间存在关系时:

    Cal Hours = RELATED(Calendar[Hours])
    

    现在,计算实际小时数与日历小时数的百分比变得更加简单:

    [FTE By Drill] := Sum(Timesheet[Hours]) / Sum(Timesheet[Cal Hours])
    

    【讨论】:

    • 这是个好主意,但如果有人不每天工作,它就不太管用了。如果他们跳过一天,那一天将被视为 0 个可能的工作小时数中的 0 个,而不是 0 或 8 个工作小时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    相关资源
    最近更新 更多