编写 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)参考 ,了解有关语法、不同函数、语句等的完整详细信息。