编写 DAX 提高复杂计算的可读性

已完成

DAX 提供了一组功能强大的函数,使你能够创建基本到复杂的计算来度量 Power BI 语义模型中的数据。 通过使用筛选条件、变量和迭代器、窗口和信息函数,可以创建高效、可读的公式。

变量

DAX 中的变量有助于简化表达式,并通过存储表达式的结果和多次重用表达式来提高性能。 这减少了重复计算的需求,使代码更易于读取和维护。

请考虑需要计算每个客户的平均销售额的场景。 可以使用变量来存储总销售额,然后在计算中使用它:

Average Sales per Customer = 
VAR Total Sales = SUM(Sales[Amount])
RETURN
    Total Sales / COUNTROWS(Sales)

虽然此示例在没有变量的情况下仍可读,但复杂的公式可以使用多个变量,并显著提高代码的可读性。

迭代器

DAX 中的迭代器函数(例如 SUMX、AVERAGEX 和 MAXX)对表执行逐行计算并返回单个值。 这些函数对执行依赖于每行上下文的计算非常有用。

例如,要计算每个产品的总利润,可以使用 SUMX 函数:

Total Profit = 
SUMX(
    Sales,
    Sales[Quantity] * (Sales[Price] - Sales[Cost])
)

请谨慎使用迭代器函数来处理大量数据,因为逐行处理可能会影响性能。

表筛选

表筛选函数(例如 FILTER、ALL 和 CALCULATETABLE)允许你根据特定条件创建筛选表。 这些函数对创建依赖于筛选上下文的动态计算非常有用。

例如,要计算特定产品类别的总销售额,可以使用 CALCULATETABLE 函数:

Total Sales for Category = 
CALCULATETABLE(
    SUMMARIZE(
        Sales,
        Sales[Amount]
    ),
    FILTER(
        Products,
        Products[Category] = "Electronics"
    )
)

CALCULATETABLE 函数修改筛选器上下文,以仅包含产品类别为“Electronics”的行。 然后,SUMMARIZE 函数会列出此筛选上下文中的销售额。 因此,在按类别显示总销售额的视觉对象中使用此度量值时,无论视觉对象中的实际类别如何,每行都仅显示“Electronics”的总销售额。

这些表筛选函数可帮助你创建动态和上下文相关的计算,从而实现更精确和更深入的数据分析。

开窗函数

DAX 中的窗口函数(例如 INDEX、OFFSET 和 WINDOW)允许对指定的数据窗口执行计算。 这些函数可用于创建排名、运行总数和其他依赖于数据顺序的计算。

例如,要比较当前产品与上一个产品的销售额,可以使用 OFFSET 函数:

Previous Product Sales = 
CALCULATE(
    SUM(Sales[Amount]),
    OFFSET(-1, ORDERBY(Sales[Date], ASC))
)

在此示例中,OFFSET 函数用于根据 Sales[Date] 列的顺序将上下文移动到上一行。 这样,便可以将当前产品的销售额与上一个产品进行比较,这对于趋势分析和其他比较计算非常有用。

信息函数

信息函数(例如 ISBLANK、ISNUMBER 和 CONTAINS)可用于执行检查,并返回有关数据的信息。 这些函数对创建条件计算和处理特殊情况很有用。

例如,可以使用 HASONEVALUE 函数检查列是否有单个非重复值。 如果只想在筛选器上下文中选择单个值时执行计算,这一点非常有用。

假设只想在选择了单个产品类别的情况下计算总销售额:

Total Sales for Single Category = 
IF(
    HASONEVALUE(Products[Category]),
    SUM(Sales[Amount]),
    BLANK()
)

HASONEVALUE 函数检查 Products[Category] 列中是否只有一个非重复值。 如果选择了单个类别,该公式将计算总销售额,如果选择了多个类别,则公式将返回 BLANK()。

通过使用 DAX 变量和函数,你可以创建更高效、更具可读性且功能更强大的计算,从而增强 Power BI 中的语义模型。

提示

请务必收藏 数据分析表达式(DAX)参考 ,了解有关语法、不同函数、语句等的完整详细信息。