DAX 平均值包括零

DAX average including zeroes

我的问题是我想计算日平均值,同时考虑带零的天数。

让我澄清一下:

我想计算每个类别单位的平均每日价值,具有以下 table:

当我总结每一天和类别的值时,我得到:

我想在平均值计算中包括零。

我使用以下代码:

SUMMARIZE(
    Data,
    Data[Category],
    "Average",
    AVERAGEX(
        SUMMARIZE(
            Data,
            Data[Date],
            "Sum of Units",
            SUM(Data[Units])
        ),
        [Sum of Units]
    )
)

但问题是对于类别 B,它没有考虑那些带有 0 的日子。

能否指导我如何解决?

提前致谢!

豪尔赫

在我看来,您需要有一个包含零值的基础行(在您的初始数据 table 中)。现在,在 2017 年 2 月 1 日,您实际上没有 B 的零值。如果添加一行值 | 2017 年 2 月 1 日 |乙 | 0 |我相信你会看到平均数占它。就目前情况而言,我认为枢轴 table 实际上没有反映任何值(空白)而不是零值,因此零目前不计入平均值。

解决这个问题的一种方法是创建一个日历 table,然后可以用它来计算任何分组期间的天数。这也意味着您可以使用非标准日历,例如 4-4-5

创建日历 table 后,您可以利用 DAX 中的 FIRSTDATELASTDATE 函数。

我建议向日历添加一个过去日期列 table,可以使用 DAX 和以下公式创建该列。 DAX 中的 today 函数在计算列中使用时只会在模型更新时进行评估。

在我的示例中,我在日期 table 中创建了一个名为 Past_Dates

的计算列

Past_dates =IF(今天() > [日期], TRUE(), BLANK())

例如,如果我创建以下度量,今天的度量仅用于说明。

Start_date:=FIRSTDATE( Dates[Date] )

End_Date:=LASTDATE( Dates[Date])

Today:=TODAY()

EndPhased:=CALCULATE( LASTDATE( Dates[Date] ), Dates[Past_dates] = TRUE())

将其添加到空主元后 table 的计算结果如下。 请注意,如果您有多年的数据,您可能希望在数据透视表的某处有年份。

拥有过去标志的想法是避免计算由于未来而不会成为任何数据的日子。因此,例如在 9 月,它只会使用 11 天的销售额,而不是完整的 30 天。

如下例所示,开始日期和结束日期的查找甚至可以按季度计算。

既然我们已经有了获取时间段开始和结束日期的方法,下一步就是将其添加到我们的计算量度中。

在下面的示例中,我们遍历每个唯一的类别名称。在该类别中,我们将售出的单位相加,然后除以 EndPhased 和 Start_Date + 1 之间的天数。然后将结果除以该时期内有数据的类别数量。

Average:=AVERAGEX (
    VALUES ( Data[Category] ),
    CALCULATE ( DIVIDE ( SUM ( Data[Units] ), [EndPhased] - [Start_date] + 1 ) )
)

我认为最好的方法是使用 UNION 函数添加缺失的零:

SUMMARIZE(
    Data,
    Data[Category],
    "Average",
    AVERAGEX(
        UNION(
            SUMMARIZE(
                Data,
                Data[Date],
                "Sum of Units",
                SUM(Data[Units])
            ),
            ADDCOLUMNS(
                EXCEPT(
                    ALL(Data[Date]),
                    VALUES(Data[Date])
                ),
                "Sum of Units",
                0
            )
        ),
        [Sum of Units]
    )
)