DAX CALCULATE() 似乎没有覆盖数据透视过滤器
DAX CALCULATE() doesn't seem to be overriding pivot filter
我正在学习使用 Power Pivot 和编写 DAX,我正在阅读我购买的一本由 Rob Collie 和 Avichal Singh 编写的书,名为 "Power Pivot and Power BI"。
前面解释了在度量中使用 CALCULATE() 时会发生什么。一个理解重点解释如下:
If a filter argument acts on a column that IS already on the pivot, it
will override the pivot context for that column
所以在一个名为 "GSR" 的简单 table 中,我有一系列发票,其中包含发票日期、产品和金额。我还有另一列将所有发票日期转换为该月的最后一天以将它们收集在一起。我创建了一个名为 "Total orders" 的度量,用于计算行数。
我使用以下方法创建了此数据的数据透视表:
- 行中的产品
- 列中的月末(但我实际上是从 Power Pivot 在我的 Month_End 列中完成的自动细分中选择了月份和年份)
- 值中的订单
此枢轴正确呈现。
现在问题:
我创建了两个切片器,它们为两个断开连接的 tables 供电;一个包含月份数字,一个包含年份。基于从每一个中选择的内容,我有一个使用 EOMONTH(DATE(),0) 创建月末的度量。此措施称为 "Comparison_Month_End".
然后我有另一个名为 "Compare_Orders" 的度量,其中包含以下内容:
CALCULATE([Total orders],FILTER(GSR,GSR[Month_End]=[Comparison_Month_End]))
所有这一切的要点 - 这是为了从 GSR 获取订单,其中月份和年份与切片器选择相匹配。我希望这个值出现在每个选定月份的数据透视表中,即不被数据透视表过滤。
然而,它不起作用。这在我看来与书中所说的相反,即如果将度量中的过滤器应用于数据透视表上的列(在本例中为 Month_End),则数据透视表过滤器将被覆盖。因此,例如,如果我的数据透视表的一列中有 2018 年 3 月 31 日,而比较月末是 2018 年 1 月 31 日,我希望看到 "Compare_Orders" 内的 1 月订单位于 3 月的旁边订单、2 月订单、12 月订单等,但它只出现在 1 月旁边。
对我来说,这与书中的示例完全相同,其中行中有年份,第 1 列为总销售额,第 2 列为 2002 年销售额。第 1 列显示每年的销售额,第 2 列针对每一行显示相同的销售额(即 2002 年销售额),即使行年份为 2001、2003 或 2004 年也是如此。2002 年销售额度量使用 CALCULATE() 对总销售额求和,过滤 "Sales[Year] = 2002"。
谁能解释一下为什么我预期会发生的事情似乎并没有发生?
谢谢。
CALCULATE
在评估其第一个参数时确实覆盖了过滤器上下文;使用提供给它的第二个参数的行作为新的过滤器上下文。然而; CALCULATE
在评估其第二个参数时不会更改过滤器上下文,因此除非明确删除,否则先前存在的过滤器将保留。
在 FILTER(GSR,GSR[Month_End]=[Comparison_Month_End])
中,FILTER
仅迭代 GSR
中存在于预先存在的过滤器上下文(枢轴上下文)中的行。要获取所有行,请使用 ALL
:
CALCULATE([Total orders],FILTER(ALL(GSR),GSR[Month_End]=[Comparison_Month_End]))
我正在学习使用 Power Pivot 和编写 DAX,我正在阅读我购买的一本由 Rob Collie 和 Avichal Singh 编写的书,名为 "Power Pivot and Power BI"。
前面解释了在度量中使用 CALCULATE() 时会发生什么。一个理解重点解释如下:
If a filter argument acts on a column that IS already on the pivot, it will override the pivot context for that column
所以在一个名为 "GSR" 的简单 table 中,我有一系列发票,其中包含发票日期、产品和金额。我还有另一列将所有发票日期转换为该月的最后一天以将它们收集在一起。我创建了一个名为 "Total orders" 的度量,用于计算行数。
我使用以下方法创建了此数据的数据透视表:
- 行中的产品
- 列中的月末(但我实际上是从 Power Pivot 在我的 Month_End 列中完成的自动细分中选择了月份和年份)
- 值中的订单
此枢轴正确呈现。
现在问题:
我创建了两个切片器,它们为两个断开连接的 tables 供电;一个包含月份数字,一个包含年份。基于从每一个中选择的内容,我有一个使用 EOMONTH(DATE(),0) 创建月末的度量。此措施称为 "Comparison_Month_End".
然后我有另一个名为 "Compare_Orders" 的度量,其中包含以下内容:
CALCULATE([Total orders],FILTER(GSR,GSR[Month_End]=[Comparison_Month_End]))
所有这一切的要点 - 这是为了从 GSR 获取订单,其中月份和年份与切片器选择相匹配。我希望这个值出现在每个选定月份的数据透视表中,即不被数据透视表过滤。
然而,它不起作用。这在我看来与书中所说的相反,即如果将度量中的过滤器应用于数据透视表上的列(在本例中为 Month_End),则数据透视表过滤器将被覆盖。因此,例如,如果我的数据透视表的一列中有 2018 年 3 月 31 日,而比较月末是 2018 年 1 月 31 日,我希望看到 "Compare_Orders" 内的 1 月订单位于 3 月的旁边订单、2 月订单、12 月订单等,但它只出现在 1 月旁边。
对我来说,这与书中的示例完全相同,其中行中有年份,第 1 列为总销售额,第 2 列为 2002 年销售额。第 1 列显示每年的销售额,第 2 列针对每一行显示相同的销售额(即 2002 年销售额),即使行年份为 2001、2003 或 2004 年也是如此。2002 年销售额度量使用 CALCULATE() 对总销售额求和,过滤 "Sales[Year] = 2002"。
谁能解释一下为什么我预期会发生的事情似乎并没有发生?
谢谢。
CALCULATE
在评估其第一个参数时确实覆盖了过滤器上下文;使用提供给它的第二个参数的行作为新的过滤器上下文。然而; CALCULATE
在评估其第二个参数时不会更改过滤器上下文,因此除非明确删除,否则先前存在的过滤器将保留。
在 FILTER(GSR,GSR[Month_End]=[Comparison_Month_End])
中,FILTER
仅迭代 GSR
中存在于预先存在的过滤器上下文(枢轴上下文)中的行。要获取所有行,请使用 ALL
:
CALCULATE([Total orders],FILTER(ALL(GSR),GSR[Month_End]=[Comparison_Month_End]))