Microsoft Power BI - DAX - SUMMARIZE + ADDCOLUMNS - 使用变量的棘手计算表

问题描述 投票:0回答:1

我有一个 Microsoft Power BI (.pbix) 文件。我需要使用 DAX 语言开发一个计算表。

(我不想要基于 Power Query 的解决方案。)

场景:

我有一个名为“SourceInput”的简单表,其中包含 EmployeeId、DeviceId 和 OperationDate 的数据。

以上三个是 SQL 术语中正确的 GROUP BY 列。

该表还有一列,名为“OperationStartTime”。

现在,对于前 3 列(EmployeeId、DeviceId 和 OperationDate)的每个组合,我们需要导出最小操作开始时间,条件是:

仅当操作开始时间在 12:00 之后时,获取给定的 EmployeeId、DeviceId 和 OperationDate 组合的最小操作开始时间,即 获取给定的 EmployeeId、DeviceId 和 OperationDate 组合的最短操作开始时间(AT 或下午 12 点后)。

如果对于给定的 EmployeeId、DeviceId 和 OperationDate 组合,在中午 12 点或之后没有 OperationStartTime,则我们显示 BLANK()。

请注意,虽然OperationDate 列是日期,但OperationStartTime 列具有日期时间值。

请参阅下面的图像文件:

我开发了一个简单的基于 DAX 的计算表,如下所示,效果很好,您可以看到 .pbix 文件。

DesiredOuput_DAX_CalculatedTable

=

ADDCOLUMNS (

              SUMMARIZE(

                         SourceInput,

                         SourceInput[EmployeeId],

                         SourceInput[DeviceId],

                         SourceInput[OperationDate],

                         SourceInput[OperationStartTime]

                       ),

              "EarliestOperationStartTimeAfter12PM", CALCULATE(

                                                                  MIN(SourceInput[OperationStartTime]),

                                                                  FILTER(

                                                                          VALUES(SourceInput[OperationStartTime]),

                                                                          HOUR(SourceInput[OperationStartTime]) >= 12

                                                                         --i.e. after 12 PM OperationStartTime only--

                                                                        )

                                                                )

           )

但是,在我的实际项目中,“SourceInput”表的列太多,我们需要删除不需要的列,因此我必须在中间步骤中使用 DAX 变量。

我开发了一个等效的基于 DAX 的计算表,如下所示,使用另一个名为“SourceInputExpanded”的源表,其中包含变量来存储中间步骤的数据:

DesiredOuput_DAX_CalculatedTable_WithVariables

=

                    VAR SourceInput_CT_Variable = SELECTCOLUMNS(

                                                                    SourceInputExpanded,

                                                                   "EmployeeId1", SourceInputExpanded[EmployeeId],
                                                                   "DeviceId1", SourceInputExpanded[DeviceId],
                                                                   "OperationDate1", SourceInputExpanded[OperationDate],
                                                                   "OperationStartTime1", SourceInputExpanded[OperationStartTime]

                                                                   --remove undesired columns using this calculated table variable--

                                                               )

                    VAR Output_CT_Variable = ADDCOLUMNS (

                                                           SUMMARIZE(

                                                                        SourceInput_CT_Variable,

                                                                        [EmployeeId1],
                                                                        [DeviceId1],
                                                                        [OperationDate1],
                                                                        [OperationStartTime1]

                                                                     ),

                                                           "EarliestOperationStartTimeAfter12PM", CALCULATE(

                                                                                                               MINX(

                                                                                                                       SourceInput_CT_Variable,

                                                                                                                       [OperationStartTime1]

                                                                                                                   ),

                                                                                                              FILTER(

                                                                                                                      SUMMARIZE(

                                                                                                                                  SourceInput_CT_Variable,

                                                                                                                                  [OperationStartTime1]

                                                                                                                               ),

                                                                                                                      HOUR([OperationStartTime1]) >= 12

                                                                                                                     --i.e. after 12 PM OperationStartTime only--

                                                                                                                    )

                                                                                                            )

                                                         )

                    RETURN Output_CT_Variable

我没有得到所需的输出。

我的第二种变量方法哪里出错了?

有人可以纠正这个吗?

我还没有完全适应使用DAX计算表变量,它的列,有一些棘手的逻辑 在与其血统相关的语法中......

输出 DAX 计算表的 EarliestOperationStartTimeAfter12PM 列不正确,GROUP BY 部分在第二种情况下不起作用。

sql variables powerbi dax summarize
1个回答
0
投票

您的第一个计算表(DesiredOuput_DAX_CalculatedTable)也不正确。您按所有四列而不是前三列进行分组,这不是您的要求所规定的。即使您有想要忽略的列,除了简单的摘要之外,您也不需要任何其他内容。这不符合您的要求吗?

DesiredOuput_DAX_CalculatedTable = 

ADDCOLUMNS (

              SUMMARIZE(

                         SourceInputExpanded,

                         SourceInputExpanded[EmployeeId],

                         SourceInputExpanded[DeviceId],

                         SourceInputExpanded[OperationDate]

                       ),

              "EarliestOperationStartTimeAfter12PM", CALCULATE(

                                                                  MIN(SourceInputExpanded[OperationStartTime]),

                                                                  FILTER(

                                                                          VALUES(SourceInputExpanded[OperationStartTime]),

                                                                          HOUR(SourceInputExpanded[OperationStartTime]) >= 12

                                                                         --i.e. after 12 PM OperationStartTime only--

                                                                        )

                                                                )

           )

© www.soinside.com 2019 - 2024. All rights reserved.