搞懂筛选上下文与行上下文,深入理解DAX计算逻辑

360影视 欧美动漫 2025-03-24 06:57 3

摘要:在Power BI的数据建模中,DAX语言的计算逻辑离不开 筛选上下文和 行上下文,如果你曾经遇到计算结果与预期不符的情况,很可能是因为没有正确理解这两种上下文的作用和区别。今天,我们就来深度解析它们的概念、应用场景,以及如何在实际工作中灵活运用。

在Power BI的数据建模中,DAX语言的计算逻辑离不开 筛选上下文和 行上下文,如果你曾经遇到计算结果与预期不符的情况,很可能是因为没有正确理解这两种上下文的作用和区别。今天,我们就来深度解析它们的概念、应用场景,以及如何在实际工作中灵活运用。

1. 筛选上下文

筛选上下文是指DAX公式在计算时,所应用的筛选条件。筛选条件可以来自于报表中的切片器、筛选器、行和列标题、图表坐标轴或者是通过 DAX 公式(如 CALCULATE 函数内部定义的过滤条件),这些条件决定了度量值计算结果。

以PowerBI星球案例模型为例,假如写了一个度量值来计算1月的销售额:

1月销售额 = CALCULATE( [销售额] , '日期表'[月] = 1 )

利用这个度量值作为值,放到矩阵中,其中矩阵的行是【产品类别】、列是【城市】,外部还有年度切片器,这些都是该度量值的筛选上下文。

以上图中的销售额5367为例,它的筛选上下文是:

城市=广州市(列标题)

产品类别=手机配件(行标题)

年度=2024(切片器)

月份=1(公式)

这些筛选上下文,对订单表进行交叉筛选符合这些条件的数据后,[销售额]最终计算结果是5367。

上面的矩阵中,是同一个度量值,在不同的单元格得到不同的结果,就是因为每个单元格所对应的筛选上下文(产品类别和城市)是不同的。

2. 行上下文

行上下文是一个至关重要但容易被忽视的概念。它的作用是在逐行计算时提供数据环境,它的核心是逐行计算,每次计算都会聚焦于当前的一行数据,并在该行的上下文内执行公式,通常用于 计算列 或 迭代函数(如SUMX、FILTER等)。

下面通过两个具体的场景来理解行上下文。

(1)计算列中的行上下文

计算列的行上下文是天然存在的,DAX会自动对每一行执行计算。比如对产品表中,添加计算列,计算每个产品的单位利润。

单位利润 = [零售价]-[采购价]

[零售价]和[采购价]这两个字段会自动引用当前行的值,这种逐行处理的机制就是行上下文的体现。

你不要因此就觉得行上下文会自动计算出当前行的数据,如果想得到每个产品的销售额,如果你直接用计算列这样写:

产品销售额 = SUM('订单表'[销售额])

将会看到很奇怪的结果:

原因就是行上下文没有筛选作用,它无法让聚合函数感知到当前行的存在,所以每行计算结果都是全部订单的销售额合计。

如果想让每行的结果是当前行产品的销售额,可以在SUM外面套个CALCULATE函数,就可以得到期望的结果。

行上下文不会自动转换为 筛选上下文,但通过CALCULATE可以完成这个转换。

(2)迭代函数中的行上下文

在使用SUMX、AVERAGEX等以X结尾的迭代函数时,也会自动创建行上下文,以AVERAGEX计算平均值为例,计算月度销售额的平均值可以这样写度量值:

平均销售额 按月 =

AVERAGEX(

VALUES('日期表'[年度月份]),

[销售额]

)

这个度量值的计算步骤是:

①先计算AVERAGEX的第一个参数,年度月份的不重复列表,这是确定逐行扫描的表;

②为上一步的表创建新的行上下文,年度月份的每一行就是一个行上下文;

③迭代计算每行上下文中的第二个参数,也就是逐行计算每个月的销售额;

④对每个月计算出来的销售额取平均值。

这个度量值中的[销售额]是个度量值,度量值也可以自动将行上下文转换为筛选上下文(因为度量值中自动隐含有CALCULATE),所以它可以计算出行上下文中每个月的销售额。

关于平均值计算的更多介绍请参考:一文掌握Power BI中平均值的计算

对于上面的度量值,AVERAGEX在函数内部创建了用于迭代的行上下文,如果这个度量值还有外部筛选上下文,那么筛选上下文同样起作用,比如将上面的度量值放到矩阵中:

在筛选上下文的作用下,VALUES('日期表'[年度月份])会返回2024年的12个月份,销售额会逐行计算当前单元格的每月销售额,矩阵的最终结果就是2024年每个城市、产品类别的月度平均销售额。

行上下文的主要作用的对表逐行迭代计算,但是对于迭代的表,以及每行计算的表达式,依然会同时受到筛选上下文的影响,通过二者的共同作用,可以更灵活的实现复杂的需求。

总结

通过上面的介绍,希望你对两种上下文有个基本的了解,其实上下文就是DAX计算的周围环境,筛选上下文用于筛选数据,相对更容易理解;行上下文用于迭代表,对表进行逐行计算。

行上下文不会自动变成筛选上下文,如果需要将行上下文变成筛选上下文,必须使用CALCULATE转换上下文。

建议通过上面的示例真正动手操作一遍,根据计算结果仔细揣摩理解,掌握了这些概念后,你才可以在Power BI的DAX计算中更精确地控制数据的计算逻辑。

实际应用中,两种上下文常常交织在一起,需要根据具体需求进行合理的使用上下文,以确保用DAX进行数据分析时返回预期的结果。

AI的飞速发展,打破了原来的技术门槛,我们要做的就是拥抱AI,结合自己领域探索AI应用场景,借助AI的超强能力,为自己的工作高效赋能,同时拓展个人的能力边界,挖掘更多潜能。

我在知识星球开设了AI专栏,聚焦于探索AI在数据分析领域的广泛应用场景,提升数据分析的效率和效果,欢迎加入,一起学习、探讨、进化,成为精通AI和Power BI的数据分析专家~

AI应用系列文章推荐:

Power BI接入DeepSeek实现批量分析,保姆级教程

我用AI做了一个DAX查询系统,制作思路分享

DeepSeek教你用PQ开挂,不会M也能搞定复杂数据整理

AI+PowerBI,你也可以搞定文本词频分析,轻松制作词云图

AI开发工具,帮你轻松在Power BI中使用本地图片

PowerBI星球的最新2024版内容合辑,值得你收藏学习:

.

来源:睿渊教育

相关推荐