计算不同条件下的平均值

时间:2019-03-13 14:13:22

标签: powerbi dax

我已经开始学习Power BI的一些基本用法,并且需要帮助来解决问题。

请参阅我的表格。

enter image description here

我想为每个ID计算最后一个条目与最后一个“状态1”的百分比的平均值。在我的数据库中,有些ID仅包含一次“状态1”状态(例如ID 4),我想排除这些ID。有可能吗?

对于此示例为:

(94 + 82 + 85) / 3 = 87

我首先尝试计算所有“状态1”的所有“百分比”的平均值。

Test Average 2 = 
CALCULATE ( 
    AVERAGEX(Tabelle1; Tabelle1[Percent]);   
    FILTER ( ALL ( Tabelle1 ); Tabelle1[Status]="Status 1" );
    ALL (Tabelle1)
)

我该如何进行?我不知道如何创建这么多条件的代码。我曾尝试研究解决方案,但放弃了。希望您能对我有所帮助,并感谢编码初学者的帮助:)

预先感谢, 珍妮

1 个答案:

答案 0 :(得分:0)

首先,欢迎来到Power BI系列!

第二,这是我如何解决您的问题...

1。创建“ DateTime”列

由于我们需要检查最新条目,并且大概您希望根据日期和时间进行检查,因此仅检查一列会更容易。

在功能区中,转到“建模”->“新列”。

New Column button

在弹出的公式栏中,输入以下公式。 Power BI可以识别日期和时间列的含义,并且由于它们都是日期/时间的元素,因此Power BI使我们可以进行简单的加法。公式中的- 1代表与时间相关的“天”。

DateTime = [Date] + [Time] - 1

2。创建平均度量

这是整个公式,其次是细分。

Last Percent Average = 
    VAR TargetStatus = "Status 1"
    VAR IDsWithMoreThanOneStatus1 = FILTER('Data', COUNTROWS(FILTER('Data', IFERROR(SEARCH(TargetStatus, [Status]), -1) > 0 && [ID] = EARLIER([ID]))) > 1)
    VAR LastStatus = FILTER(IDsWithMoreThanOneStatus1, IFERROR(SEARCH(TargetStatus, [Status]), -1) > 0 && [DateTime] >= MAXX(FILTER('Data', IFERROR(SEARCH(TargetStatus, [Status]), -1) > 0 && [ID] = EARLIER([ID])), [DateTime]))

RETURN
    DIVIDE(SUMX(LastStatus, [Percent]), COUNTROWS(LastStatus), BLANK())

度量的第一部分是定义变量。变量非常有用,我鼓励您至少快速浏览一下它们。这里只是one article

第一个变量只是指定目标状态(以防您要更改它)。该变量是可选的,就好像它永远不会改变一样,您可以将文本放入其他公式中。

    VAR TargetStatus = "Status 1"

第二个变量将主数据列表筛选为仅具有多个“状态1”的ID(在这种情况下,ID = 4)。带有此变量的键之一是EARLIER函数。尽管它被可怕地命名(我认为),但它非常有用。您可以阅读here上的官方文档。

逐步遍历变量:我们要过滤数据表...,其中行数大于一...当我们过滤表以包括指定ID的“状态1”时。

SEARCH函数将查看整个字符串,并告诉我们搜索字符串(TargetStatus)的开始位置。我们需要将其包装在IFERROR函数中,以处理TargetStatus未显示在[Status]值中的情况。然后,我们只是检查结果是否大于0,表明TargetStatus在[Status]值中。

VAR IDsWithMoreThanOneStatus1 = 
        FILTER(
            'Data',
            COUNTROWS(
                FILTER(
                    'Data',
                    IFERROR(SEARCH(TargetStatus, [Status]), -1) > 0 &&
                    [ID] = EARLIER([ID])
                )
            ) > 1
        )

第三个变量从第二个变量中过滤列表,以捕获每个ID的最后一个“状态1”。这使用与第二个变量相同的思维过程:我们要过滤状态为“ Status 1”且[DateTime]大于或等于所有“ DateTime”最大值的表(来自第二个变量)状态1”用于指定的ID。

    VAR LastStatus = 
        FILTER(
            IDsWithMoreThanOneStatus1,
            IFERROR(SEARCH(TargetStatus, [Status]), -1) > 0 &&
            [DateTime] >= MAXX(
                FILTER(
                    'Data',
                    IFERROR(SEARCH(TargetStatus, [Status]), -1) > 0 &&
                    [ID] = EARLIER([ID])
                ),
                [DateTime]
            )
        )

RETURN关键字只是在告诉Power BI我们已经完成了定义变量的工作,公式中的所有其他内容都定义了为此度量返回的实际值。

RETURN

最后是平均值本身。在这种情况下,我们将使用SUMX对第三个变量的所有[Percent]求和,然后将其除以第三个变量的行数。我总是建议使用DIVIDE函数,因为该函数可用于除以0和其他错误。

    DIVIDE(
        SUMX(
            LastStatus,
            [Percent]
        ),
        COUNTROWS(LastStatus),
        BLANK()
    )

说完所有步骤后,您的测量将得到想要的结果。

enter image description here