CALCULATE()函数是DAX中最复杂的函数,用于计算由指定过滤器修改的上下文中的表达式。
CALCULATE(<expression>,<filter1>,<filter2>…) 

第一个参数是用于计算聚合值的度量,后面的参数是可选的过滤器,共有两种类型:

  • 返回布尔值的逻辑表达式
  • 返回表值的表达式

CALCULATE函数的复杂之处在于可变的计算上下文。如果数据已被过滤,则CALCULATE函数会更改过滤数据的上下文,并在您指定的新上下文中计算表达式。 对于filter参数中使用的每个列,将删除该列上的任何现有过滤器,并应用filter参数中使用的过滤器。

对于CALCULATE函数过滤上下文来说,filter参数的顺序是十分重要的。对于同一列,后面的filter参数会覆盖前面的filter参数设置的过滤上下文;对于不同列,filter参数指定的过滤上下文是共同作用的。

一,保持过滤器

在DAX中增加过滤器,一种行为是替换相同列上的所有现有的过滤器,使用参数指定的过滤器来计算表达式,也就是说,在移除相同列上原有的过滤器之后,而采用新的过滤器上下文。另外一种行为是不移除当前上下文中原有的过滤器,将当前上下文中的任何现有过滤器与参数中指定的过滤器进行比较,并把这两种过滤器的交集用作评估表达式的上下文,也就是说,向现有的过滤器上下文中增加新的过滤器,KEEPFILTERS 函数表现的是后一种行为。

KEEPFILTERS(<expression>)  

默认情况下,CALCULATE等函数中的过滤器参数用作评估表达式的上下文,过滤器参数会替换相同列上的所有现有过滤器。CALCULATE等函数的filter参数,只能修改filter参数中提到的列上的上下文。filter参数中没有提到的列,其过滤器不受任何影响。

KEEPFILTERS函数允许您修改此行为,使用KEEPFILTERS时,将当前上下文中的任何现有过滤器与过滤器参数中的列进行比较,并将这些参数的交集用作评估表达式的上下文。换句话说,当CALCULATE过滤器替换当前上下文时,KEEPFILTERS会将过滤器添加到当前上下文中。

二,计算表表达式

在由给定过滤器修改的上下文中计算表表达式:

CALCULATETABLE(<expression>,<filter1>,<filter2>,…) 

CALCULATETABLE 函数使用filter参数来更改过滤数据的上下文,在指定的新上下文中计算表达式。 对于filter参数中使用的每个列,将删除该列上的任何现有过滤器,并应用filter参数中使用的过滤器。

例如,下面的公式,计算2016年的销售总量:

=SUMX( CALCULATETABLE('InternetSales', 'DateTime'[CalendarYear]=)
, [SalesAmount])

其中,RELATEDTABLE(<tableName>) 是CALCULATETABLE(<tableName>) 的同义词。

三,修改关系

DAX在引用关系时,可以在查询上下文中临时修改关系的设置,比如引用处于不活跃状态的关系,修改现有关系的交叉过滤的方向设置。重写的关系设置只在查询时有效,不会影响数据模型中的关系设置。

1,引用已有的关系

USERELATIONSHIP使用数据模型中已有的关系,通过关系两端的字段来指定关系:

USERELATIONSHIP(<columnName1>,<columnName2>) 

在USERELATIONSHIP函数中,关系的状态是不重要的,但是关系必须事先创建于数据模型中,由于活跃的关系在DAX中是可以直接引用的,因此,该函数实际上用于引用处于不活跃(Inactive)状态的关系。

=CALCULATE(SUM(InternetSales[SalesAmount]), USERELATIONSHIP(InternetSales[ShippingDate], DateTime[Date])) 

2,指定交叉过滤的方向

CROSSFILTER 使用数据模型中已有的关系,通过关系两端的字段来指定关系:

CROSSFILTER(<columnName1>, <columnName2>, <direction>) 

在CROSSFILTER 中,关系的交叉过滤(cross-filtering)的设置是不重要的,也就是说,不论关系在数据模型中设置为single 方向或both方向,都不会影响函数的使用,CROSSFILTER将覆盖任何现有的交叉过滤(cross-filtering)设置。

参考文档:

详解CALCULATE系列-基础篇

CALCULATE 庖丁解牛系列-- 扩展表(1)

DAX 第四篇:CALCULATE详解的更多相关文章

  1. 《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)

    1.简介 在使用appium写app自动化的时候介绍toast的相关元素的定位,在Web UI测试过程中,也经常遇到一些toast,那么这个toast我们这边如何进行测试呢?今天宏哥就分两篇介绍一下. ...

  2. 《手把手教你》系列技巧篇(四十六)-java+ selenium自动化测试-web页面定位toast-下篇(详解教程)

    1.简介 终于经过宏哥的不懈努力,偶然发现了一个toast的web页面,所以直接就用这个页面来夯实一下,上一篇学过的知识-处理toast元素. 2.安居客 事先声明啊,宏哥没有收他们的广告费啊,纯粹是 ...

  3. Mysql高手系列 - 第14篇:详解事务

    这是Mysql系列第14篇. 环境:mysql5.7.25,cmd命令中进行演示. 开发过程中,会经常用到数据库事务,所以本章非常重要. 本篇内容 什么是事务,它有什么用? 事务的几个特性 事务常见操 ...

  4. 学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳

    学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳 ...

  5. 学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳

    学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳 ...

  6. ElasticSearch第四步-查询详解

    ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticSea ...

  7. J2EE进阶(四)Spring配置文件详解

    J2EE进阶(四)Spring配置文件详解 前言 Spring配置文件是用于指导Spring工厂进行Bean生产.依赖关系注入(装配)及Bean实例分发的"图纸".Java EE程 ...

  8. [转]Linux服务器上11种网络连接状态 和 TCP三次握手/四次挥手详解

    一.Linux服务器上11种网络连接状态: 图:TCP的状态机 通常情况下:一个正常的TCP连接,都会有三个阶段:1.TCP三次握手;2.数据传送;3.TCP四次挥手. 注:以下说明最好能结合”图:T ...

  9. TCP三次握手与四次挥手详解

    目录 TCP三次握手与四次挥手详解 1.TCP报文格式 2.TCP三次握手 3.TCP四次挥手 4.为什么建立连接需要三次握手? 5.为什么断开连接需要四次挥手? 6.为什么TIME_WAIT状态还需 ...

  10. Mysql高手系列 - 第8篇:详解排序和分页(order by & limit),及存在的坑

    这是Mysql系列第8篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符号分开的表示可选其一. 本章内容 详解排序查询 详解limit limit存在的坑 分 ...

随机推荐

  1. oracle学习笔记(十九) 子程序——存储过程

    子程序--存储过程 我们可以使用子程序来封装一下我们需要的操作,子程序又有存储过程,函数和触发器. 这里先学习存储过程~ 语法 create [or replace] procedure $proce ...

  2. wpf file embeded resource is readonly,Copy always will copy the file and its folder to the bin folder

    Wpf file embeded resource will compile the file into the assembly and it will be readonly and can no ...

  3. Go template高级用法、深入详解、手册、指南、剖析

    入门示例 以下为test.html文件的内容,里面使用了一个template语法{{.}}. <!DOCTYPE html> <html> <head> <m ...

  4. ASP.NET Core框架深度学习(三) Server对象

    8.Server   第五个对象 服务器在管道中的职责非常明确,当我们启动应用宿主的WebHost的时候,服务它被自动启动.启动后的服务器会绑定到指定的端口进行请求监听,一旦有请求抵达,服务器会根据该 ...

  5. python基础教程:dir()和__dict__属性的区别

    只要是有属性的数据对象(不一定是面向对象的对象实例,而是指具有数据类型的数据对象),都可以通过- ---- __dict__和dir()来显示数据对象的相关属性. __ dict__可以看作是数据对象 ...

  6. 终于我还是没忍住,用Python爬了一波女神

    你学爬虫,最终不还是为了爬妹子 啥也不说,开始福利赠送~ 女神大会 不是知道有多少人知道“懂球帝”这个 APP(网站),又有多少人关注过它的一个栏目“女神大会”,在这里,没有足球,只有女神哦. 画风是 ...

  7. HTTP 压测工具wrk简介

    前段时间项目压测,看到开发命令行下使用这个命令进行压测非常简洁.方便,萌发了学习的兴趣,这里仅做简单介绍. 安装 wrk支持大多数UNIX系统,不支持Windows.需要操作系统支持LuaJIT和Op ...

  8. MySQL基于报错注入1

    0x1 判断注入点: http://www.xxxx.ro/s.php?id=1' 那么尝试闭合下单引号 http://www.xxxx.ro/s.php?id=1' --+ 0x2 枚举下表的列 h ...

  9. 关于MySQL的一些骚操作——提升正确性,抠点性能

    概要 回顾以前写的项目,发现在规范的时候,还是可以做点骚操作的. 假使以后还有新的项目用到了MySQL,那么肯定是要实践一番的. 为了准备,创建测试数据表(建表语句中默认使用utf8mb4以及utf8 ...

  10. Mysql—日志文件系统

    MySQL中的日志包括:错误日志.通用查询日志.二进制日志.慢查询日志等等.这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志. 错误日志:记录启动.运行或停止mysqld时出现的问题.通用日 ...