介绍
关于CALCULATE函数,据说是DAX函数的基础和精髓,我在YouTube上看过SQLBI,所以在忘记之前先用自己的话复制一下。
在 DAX 中计算
什么是CALCULATE函数
从文档中引用。
在修改后的筛选上下文中评估表表达式。
在 Power BI 中,当您想要应用通用“过滤器”(Excel 大脑!??)时,首先考虑
CALCULATE函数。即使您检查语法,您也可以看到它的编写方式是在末尾添加了评估目标的过滤器。
在视频中,覆盖外部过滤器上下文的表它被介绍。CALCULATE(<expression>[, <filter1> [, <filter2> [, …]]])样本数据
我正在使用 Contoso 数据。获取方法请参考以下文章。
简单星模式?
操作验证
从简单的事情开始
首先,只需编写一个条件表达式。指定条件的数值('Product'[Color] = "Green")出现在表格视觉对象的任何颜色列中。
GreenSales = CALCULATE( [SalesAmount], 'Product'[Color] = "Green" )
即使您使用外部切片器缩小颜色范围,运动也不会发生变化。
CALCULATE函数不考虑所有过滤器上下文,只考虑CALCULATE函数内的条件?
ALL它与使用该函数显式写入忽略所有过滤器上下文具有相同的行为。GreenSalesFALL = CALCULATE( [SalesAmount], FILTER( ALL('Product'[Color]), 'Product'[Color] = "Green" ) )
结合
KEEPFILTERS函数忽略所有过滤器上下文可能不是预期的结果。
CALCULATE函数需要显式保留过滤器上下文,因为默认行为会覆盖所有过滤器上下文。GreenSalesKF = CALCULATE( [SalesAmount], KEEPFILTERS( 'Product'[Color] = "Green" ) )
FILTER函数使用错误如何使用
FILTER函数编写并获得类似结果。但是,这是通过独立于现有过滤器上下文重新扫描整个表来实现的,这可能在计算上很昂贵并且需要很长时间才能获得结果。使用KEEPFILTERS函数来利用现有的过滤器上下文?FilterGreen = CALCULATE( [SalesAmount], FILTER( 'Product', 'Product'[Color] = "Green" ) )
结合
REMOVEFILTERS功能接下来是与
REMOVEFILTERS函数的组合。您可以使用REMOVEFILTERS函数删除应用于指定列的过滤器。在这种情况下,我们删除了'Product'[Color]列上的过滤器,这导致显示所有销售。All Colors = CALCULATE( [SalesAmount], REMOVEFILTERS('Product'[Color]) )
'Product'[Color]列上的所有过滤器都已删除,因此当您在外部切片器中选择一种颜色时,您仍然可以看到总体销售额。
如果您在表格视觉对象的列中指定
'Product'[Brand],则会保留每行的上下文并且值会更改?
查找百分比 =>
DIVIDE函数
CALCULATE函数还用于计算百分比时的任意分母。让我们编写以下 DAX 并查看结果。Pct% = DIVIDE( [SalesAmount], CALCULATE( [SalesAmount], REMOVEFILTERS('Product') ) )
乍一看,它看起来工作正常,但我使用
REMOVEFILTERS函数删除的过滤器是一个跨越整个表的过滤器。为了验证这一点,我们还要在矩阵视图中添加'Product'[Brand]列。那么,每个品牌的百分比就是整体的百分比。
如果要从一列中删除过滤器,则必须指定该列。
为整个表操作筛选上下文可能会导致错误的结果,因此请指定最小列数我们不要忘记?PctColor% = DIVIDE( [SalesAmount], CALCULATE( [SalesAmount], REMOVEFILTERS('Product'[Color]) ) )
在这种状态下,当我尝试用切片器缩小范围时,每个项目的数字仍然显示整体的百分比,因此显示难以理解的数字,包括总计列。所以让我们继续吧?
结合
ALLSELECTED功能在上述情况下,使用
ALLSELECTED函数可以按预期工作。ALLSELECTED函数保留外部过滤器(切片器)并删除视觉对象上的过滤器。
现在尝试
ALLSELECTED函数到Product整个表而不是列规范。然后还会应用来自视觉对象的[Brand]列的过滤器上下文。
指定多个条件
当然,有时您想指定多个条件。
CALCULATE让我们将多个条件与函数并排编写,并检查它会给出什么样的结果。Contoso Green = CALCULATE( [SalesAmount], 'Product'[Brand] = "Contoso", 'Product'[Color] = "Green" )
这样,如果你把条件和
CALCULATE函数并排写和会处理。然后或条件当我想指定时我应该怎么做或条件可以使用运算符||。与条件也可以使用&&运算符。Contoso Green = CALCULATE( [SalesAmount], 'Product'[Brand] = "Contoso" || 'Product'[Color] = "Green" )
结合
IN您还可以使用
IN指定多个条件。从结果中可以看出,使用IN会导致OR条件。您可以看到计算了红色或绿色销售额。当为同一列指定多个条件时,使其紧凑似乎很好。{ } 是表构造函数,它创建一个列名为 Value 的表。也可以在其中创建一个带有 ( ) 的行。
{
(1.5, 日期(2017, 1, 1), CURRENCY(199.99), "A"),
(2.5, 日期(2017, 1, 2), CURRENCY(249.99), "B"),
(3.5,日期(2017 年 1 月 3 日),货币(299.99),“C”)
}
当我这样写时,它会变成这样。
Red Green Sales = CALCULATE( [SalesAmount], 'Product'[Color] IN { "Red" , "Green" } )
当
IN运算符被包裹在KEEPFILTERS函数中时会发生什么?使用KEEPFILTERS函数取决于外部切片器和视觉对象的过滤器上下文,从而导致仅显示绿色和红色行的销售额。Keep Red Green Sales = CALCULATE( [SalesAmount], KEEPFILTERS( 'Product'[Color] IN { "Red" , "Green" } ) )
结合
VALUES功能接下来,我们将尝试使用日历表。为了在表格中显示除以季度的销售额比率,请编写并应用下面的 DAX。结果如图所示。
PctDate% = DIVIDE( [SalesAmount], CALCULATE( [SalesAmount], REMOVEFILTERS('Date') ) )
这样,销售的日期,所有时期都是目标,并显示其中的百分比。在实践中,通常按年计算。使用
VALUES函数在REMOVEFILTERS函数之后添加过滤条件。PctDateValues% = DIVIDE( [SalesAmount], CALCULATE( [SalesAmount], REMOVEFILTERS('Date'), VALUES('Date'[Year]) ) )
正如您在图片中看到的,已应用年度过滤器,因此每年的总数为 100%。
VALUES和REMOVEFILTERS函数的编写顺序无关紧要? 结果是一样的。结合
TREATAS功能最后,一个小应用版本? 当你想计算某一年的销售额时,写下面的DAX,看看结果。结果计算正确。
Sales 2011-2012 = CALCULATE( [SalesAmount], 'Date'[Year] IN { 2011 , 2012 } )
让我们写一个这样的表达式:
{ 2011 , 2012 }部分被识别为列名为Value的表,因为没有附加关系,所以没有报错,但是没有像以前那样正确计算,和[SalesAmount]不同。我得到一个不存在的号码。
价值 2011 2012
Sales 2011-2012 TE = CALCULATE( [SalesAmount], { 2011 , 2012 } )
在这种情况下使用
TREATAS函数。将表指定为第一个参数,并在该表中指定要过滤的列。然后您可以看到与以前一样计算出相同的正确数字。Sales 2011-2012 TREATAS = CALCULATE( [SalesAmount], TREATAS( { 2011 , 2012 }, 'Date'[Year] ) )
概括
我觉得我对
CALCULATE函数和过滤上下文更近了一点。就算能懂不懂的东西,也有收获??文档
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308622538.html