介绍

关于CALCULATE函数,据说是DAX函数的基础和精髓,我在YouTube上看过SQLBI,所以在忘记之前先用自己的话复制一下。

在 DAX 中计算

什么是CALCULATE函数

从文档中引用。

在修改后的筛选上下文中评估表表达式。

在 Power BI 中,当您想要应用通用“过滤器”(Excel 大脑!??)时,首先考虑 CALCULATE 函数。即使您检查语法,您也可以看到它的编写方式是在末尾添加了评估目标的过滤器。
在视频中,覆盖外部过滤器上下文的表它被介绍。

CALCULATE(<expression>[, <filter1> [, <filter2> [, …]]])

样本数据

我正在使用 Contoso 数据。获取方法请参考以下文章。

简单星模式?

[Power BI] CALCULATE関数、基礎の基礎?

操作验证

从简单的事情开始

首先,只需编写一个条件表达式。指定条件的数值('Product'[Color] = "Green")出现在表格视觉对象的任何颜色列中。

GreenSales = CALCULATE(
    [SalesAmount],
    'Product'[Color] = "Green"
)

[Power BI] CALCULATE関数、基礎の基礎?

即使您使用外部切片器缩小颜色范围,运动也不会发生变化。 CALCULATE 函数不考虑所有过滤器上下文,只考虑 CALCULATE 函数内的条件?

[Power BI] CALCULATE関数、基礎の基礎?

ALL 它与使用该函数显式写入忽略所有过滤器上下文具有相同的行为。

GreenSalesFALL = CALCULATE(
    [SalesAmount],
    FILTER(
        ALL('Product'[Color]),
        'Product'[Color] = "Green"
    )
)

[Power BI] CALCULATE関数、基礎の基礎?

结合KEEPFILTERS函数

忽略所有过滤器上下文可能不是预期的结果。 CALCULATE 函数需要显式保留过滤器上下文,因为默认行为会覆盖所有过滤器上下文。

GreenSalesKF = CALCULATE(
    [SalesAmount],
    KEEPFILTERS(
        'Product'[Color] = "Green"
    )
)

[Power BI] CALCULATE関数、基礎の基礎?

FILTER函数使用错误

如何使用FILTER 函数编写并获得类似结果。但是,这是通过独立于现有过滤器上下文重新扫描整个表来实现的,这可能在计算上很昂贵并且需要很长时间才能获得结果。使用KEEPFILTERS 函数来利用现有的过滤器上下文?

FilterGreen = CALCULATE(
    [SalesAmount],
    FILTER(
        'Product',
        'Product'[Color] = "Green"
    )
)

[Power BI] CALCULATE関数、基礎の基礎?

结合REMOVEFILTERS功能

接下来是与REMOVEFILTERS 函数的组合。您可以使用REMOVEFILTERS 函数删除应用于指定列的过滤器。在这种情况下,我们删除了 'Product'[Color] 列上的过滤器,这导致显示所有销售。

All Colors = CALCULATE(
    [SalesAmount],
    REMOVEFILTERS('Product'[Color])
)

[Power BI] CALCULATE関数、基礎の基礎?

'Product'[Color] 列上的所有过滤器都已删除,因此当您在外部切片器中选择一种颜色时,您仍然可以看到总体销售额。

[Power BI] CALCULATE関数、基礎の基礎?

如果您在表格视觉对象的列中指定'Product'[Brand],则会保留每行的上下文并且值会更改?

[Power BI] CALCULATE関数、基礎の基礎?

查找百分比 => DIVIDE 函数

CALCULATE 函数还用于计算百分比时的任意分母。让我们编写以下 DAX 并查看结果。

Pct% = 
DIVIDE(
    [SalesAmount],
    CALCULATE(
        [SalesAmount], 
        REMOVEFILTERS('Product')
    )
)

[Power BI] CALCULATE関数、基礎の基礎?

乍一看,它看起来工作正常,但我使用REMOVEFILTERS 函数删除的过滤器是一个跨越整个表的过滤器。为了验证这一点,我们还要在矩阵视图中添加'Product'[Brand] 列。那么,每个品牌的百分比就是整体的百分比。

[Power BI] CALCULATE関数、基礎の基礎?

如果要从一列中删除过滤器,则必须指定该列。
为整个表操作筛选上下文可能会导致错误的结果,因此请指定最小列数我们不要忘记?

PctColor% = 
DIVIDE(
    [SalesAmount],
    CALCULATE(
        [SalesAmount], 
        REMOVEFILTERS('Product'[Color])
    )
)

[Power BI] CALCULATE関数、基礎の基礎?

在这种状态下,当我尝试用切片器缩小范围时,每个项目的数字仍然显示整体的百分比,因此显示难以理解的数字,包括总计列。所以让我们继续吧?

[Power BI] CALCULATE関数、基礎の基礎?

结合ALLSELECTED功能

在上述情况下,使用 ALLSELECTED 函数可以按预期工作。 ALLSELECTED 函数保留外部过滤器(切片器)并删除视觉对象上的过滤器。

[Power BI] CALCULATE関数、基礎の基礎?

现在尝试 ALLSELECTED 函数到 Product 整个表而不是列规范。然后还会应用来自视觉对象的[Brand] 列的过滤器上下文。

[Power BI] CALCULATE関数、基礎の基礎?

指定多个条件

当然,有时您想指定多个条件。 CALCULATE 让我们将多个条件与函数并排编写,并检查它会给出什么样的结果。

Contoso Green = 
CALCULATE(
    [SalesAmount],
    'Product'[Brand] = "Contoso",
    'Product'[Color] = "Green"
)

[Power BI] CALCULATE関数、基礎の基礎?

这样,如果你把条件和CALCULATE函数并排写会处理。然后或条件当我想指定时我应该怎么做或条件可以使用运算符||与条件也可以使用&& 运算符。

Contoso Green = 
CALCULATE(
    [SalesAmount],
    'Product'[Brand] = "Contoso" || 'Product'[Color] = "Green"
)

[Power BI] CALCULATE関数、基礎の基礎?

结合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”)
}
当我这样写时,它会变成这样。
[Power BI] CALCULATE関数、基礎の基礎?

Red Green Sales = 
CALCULATE(
    [SalesAmount],
    'Product'[Color] IN { "Red" , "Green" }
)

[Power BI] CALCULATE関数、基礎の基礎?

IN 运算符被包裹在KEEPFILTERS 函数中时会发生什么?使用 KEEPFILTERS 函数取决于外部切片器和视觉对象的过滤器上下文,从而导致仅显示绿色和红色行的销售额。

Keep Red Green Sales = 
CALCULATE(
    [SalesAmount],
    KEEPFILTERS(
        'Product'[Color] IN { "Red" , "Green" }
    )
)

[Power BI] CALCULATE関数、基礎の基礎?

结合VALUES功能

接下来,我们将尝试使用日历表。为了在表格中显示除以季度的销售额比率,请编写并应​​用下面的 DAX。结果如图所示。

PctDate% = 
DIVIDE(
    [SalesAmount],
    CALCULATE(
        [SalesAmount], 
        REMOVEFILTERS('Date')
    )
)

[Power BI] CALCULATE関数、基礎の基礎?

这样,销售的日期,所有时期都是目标,并显示其中的百分比。在实践中,通常按年计算。使用VALUES 函数在REMOVEFILTERS 函数之后添加过滤条件。

PctDateValues% = 
DIVIDE(
    [SalesAmount],
    CALCULATE(
        [SalesAmount], 
        REMOVEFILTERS('Date'),
        VALUES('Date'[Year])
    )
)

[Power BI] CALCULATE関数、基礎の基礎?

正如您在图片中看到的,已应用年度过滤器,因此每年的总数为 100%。 VALUESREMOVEFILTERS 函数的编写顺序无关紧要? 结果是一样的。

结合TREATAS功能

最后,一个小应用版本? 当你想计算某一年的销售额时,写下面的DAX,看看结果。结果计算正确。

Sales 2011-2012 = 
CALCULATE(
    [SalesAmount], 
    'Date'[Year] IN { 2011 , 2012 }
)

[Power BI] CALCULATE関数、基礎の基礎?

让我们写一个这样的表达式: { 2011 , 2012 }部分被识别为列名为Value的表,因为没有附加关系,所以没有报错,但是没有像以前那样正确计算,和[SalesAmount]不同。我得到一个不存在的号码。

价值
2011
2012

Sales 2011-2012 TE = 
CALCULATE(
    [SalesAmount], 
    { 2011 , 2012 }
)

[Power BI] CALCULATE関数、基礎の基礎?

在这种情况下使用TREATAS 函数。将表指定为第一个参数,并在该表中指定要过滤的列。然后您可以看到与以前一样计算出相同的正确数字。

Sales 2011-2012 TREATAS = 
CALCULATE(
    [SalesAmount], 
    TREATAS(
        { 2011 , 2012 },
        'Date'[Year]
    )
)

[Power BI] CALCULATE関数、基礎の基礎?

概括

我觉得我对CALCULATE 函数和过滤上下文更近了一点。就算能懂不懂的东西,也有收获??

文档


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308622538.html

相关文章:

  • 2021-06-05
  • 2021-12-15
  • 2022-12-23
  • 2022-12-23
  • 2021-06-17
  • 2021-12-31
  • 2021-04-15
猜你喜欢
  • 2021-12-28
  • 2021-05-16
  • 2021-12-24
  • 2021-10-21
  • 2021-12-27
  • 2021-11-11
  • 2021-05-13
相关资源
相似解决方案