计算上下文是计算公式的环境,任何DAX表达式都是在上下文中求值的。行上下文和筛选上下文是DAX中仅有的上下文类型,把这两种上下文称为计算上下文。计算上下文用于限定公式计算的环境,当上下文变化时,相同的公式会计算出不同的结果。

一,计算上下文

在PowerBI中创建的计算列是在行上下文中执行计算,创建的度量(meassure)是在筛选上下文中执行计算。

  • 行上下文是一个总是包含一行的上下文,DAX在创建计算列时自动定义行上下文。
  • 筛选上下文是由切片器(Slicer)、用户选择的分组字段、关系的筛选方向等过滤器共同定义的,而DAX利用筛选上下文来计算公式(度量)。

二,行上下文

行上下文仅仅存在于表的同一行中,作用是对表中同一行的不同列,应用公式,逐行计算出公式的结果。

例如,创建一个计算列 Profit,利润的公式是由商品的   销售额 - 税额 - 成本 - 运费,DAX公式如下所示:

  1. Profit = FactSales[SalesAmount]-FactSales[TaxAmt]-FactSales[TotalProductCost] - FactSales[Freight]

DAX逐行应用公式,对于表中每一行,都会根据公式,把同一行上的不同列的值代入到公式中,计算出公式的结果:

实际上,用于执行计算的行并没有存储在公式中,而是定义在行上下文中。从逻辑的角度来讲,计算列的工作流程是:

  • 当你定义计算的列时,DAX从表的第一行开始迭代,首先创建了包含该行的行上下文并对表达式求值,
  • 然后它移到第二行,再次求出表达式;
  • 这发生在表格中所有的行中,如果你有100万行,你可以认为DAX创建了100万行上下文来评估这个公式100万次。

三,筛选上下文

创建的度量在筛选上下文中执行公式的计算,筛选上下文是对表应用过滤器之后,数据被筛选之后的上下文。筛选上下文是由过滤器共同作用的,过滤器主要有:切片器(Slicer),分组列和关系。DAX的强大之处在于,DAX不仅能够自动应用筛选上下文,还支持修改、清除和重定义筛选上下文。
1,自动应用筛选上下文

在PowerBI的FactSlaes表中定义一个度量,用于计算总的销售额:
  1. Measure SumOfAccount = CALCULATE(SUM(FactSales[SalesAmount]))

为该度量增加一个分组列FullName,可以看到,这个分组列对度量的上下文进行过滤,使其只能计算每个FullName对象的销售额,而度量自动应用筛选之后的上下文,计算每个FullName的销售额:

FullName是DimCustomers表的字段,该字段能够自动过滤FactSales表的原因是在数据模型中,表DimCustomers和表FactSlaes之间存在关系,并且关系的方向是由DimCustomer指向FactSales,这说明,DimCustomers可以过滤FactSales:

2,关系的方向

当关系的方向是由A指向B时,说明A可以筛选B,而B不能用来筛选A。上图中,表DimCustomers和表FactSlaes之间存在关系,并且关系的方向是由DimCustomer指向FactSales,这说明,DimCustomers可以过滤FactSales。我们来测试一下,FactSales是否可以筛选DimCustomers?创建一个新的度量,测试使用FactSales的ProductKey来统计用户的数量:

  1. Measure CountCustomer = CALCULATE(COUNT(DimCustomers[CustomerKey]))

测试的结果是 Measure CountCustomers的值是DimCustomers表的总数量,也就是说,ProductKey不能过滤DimCustomers表。

当把DimCustomer和FactSales之间的关系修改为双向时:

用于FactSales可以过滤DimCustomers,DAX自动应用筛选上下文,统计每个ProductKey对应的客户数量:

3,修改、清除和重定义筛选上下文

使用DAX函数可以修改、清除和重定义筛选上下文。CALCULATE()函数是DAX中最复杂的函数,用于计算由指定过滤器修改的上下文中的表达式。

  1. CALCULATE(<expression>,<filter1>,<filter2>…)

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

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

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

参考文档:

【DAX圣经】第四章:理解计算上下文(1)

详解CALCULATE系列-基础篇

DAX 第二篇:计算上下文的更多相关文章

  1. 第二篇 界面开发 (Android学习笔记)

    第二篇 界面开发 第5章 探索界面UI元素 ●The Android View Class     ●△Widget设计步骤 需要修改三个XML,以及一个class: 1)第一个xml是布局XML文件 ...

  2. 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  3. (转)从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    原文地址:  http://www.cnblogs.com/lyhabc/p/4682028.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集 ...

  4. 深入理解javascript对象系列第二篇——属性操作

    × 目录 [1]查询 [2]设置 [3]删除[4]继承 前面的话 对于对象来说,属性操作是绕不开的话题.类似于“增删改查”的基本操作,属性操作分为属性查询.属性设置.属性删除,还包括属性继承.本文是对 ...

  5. 前端工程师技能之photoshop巧用系列第二篇——测量篇

    × 目录 [1]测量信息 [2]实战 [3]注意事项 前面的话 前端工程师使用photoshop进行的大量工作实际上是测量.本文是photoshop巧用系列第二篇——测量篇 测量信息 在网页制作中需要 ...

  6. 【OpenGL】第二篇 Hello OpenGL

    ---------------------------------------------------------------------------------------------------- ...

  7. Python开发【第二篇】:初识Python

    Python开发[第二篇]:初识Python   Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏 ...

  8. RabbitMQ学习总结 第二篇:快速入门HelloWorld

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  9. 第二篇 Integration Services:SSIS数据泵

    本篇文章是Integration Services系列的第二篇,详细内容请参考原文. 简介SSIS用于移动数据.数据流任务提供此功能.因为这个原因,当介绍SSIS时我喜欢从数据流任务开始.数据流任务的 ...

随机推荐

  1. 程序定义了多个入口点。使用 /main (指定包含入口点的类型)进行编译

    原文:请使用/main进行编译,以指定包含入口点类型 在使用VS工具初学C#的时候需要不停的写小程序,觉得每次都新建项目太过麻烦,所以试着把程序写在一个项目下面,结果编译的时候出错了,因为我每个小程序 ...

  2. python脚本,重新设置图片大小

    最近在做一个android的电台,此android程序要访问自己服务器上的歌曲文件,包括图片.这些文件要自己手动上传. 每天十首歌,需要二十个图片(一个大图450*450.一个小图140*140). ...

  3. Android零基础入门第25节:最简单最常用的LinearLayout线性布局

    原文:Android零基础入门第25节:最简单最常用的LinearLayout线性布局 良好的布局设计对于UI界面至关重要,在前面也简单介绍过,目前Android中的布局主要有6种,创建的布局文件默认 ...

  4. 浅析在QtWidget中自定义Model(beginInsertRows()和endInsertRows()是空架子,类似于一种信号,用来通知底层)

    Qt 4推出了一组新的item view类,它们使用model/view结构来管理数据与表示层的关系.这种结构带来的功能上的分离给了开发人员更大的弹性来定制数据项的表示,它也提供一个标准的model接 ...

  5. 对c&c++源文件和头文件分开的好处的一点认识

    对c&c++程序来说,基本上来说都是要把源文件和头文件分别编写.一般都是代表一个基本功能的源文件引用相应的头文件. 一个 相关功能的模块可能有若干对源文件和头文件组成.这是基于组件编程的核心. ...

  6. CSS3 GENERATOR可以同时为一个元素完成border-radius、box-shadow、gradient和opacity多项属性的设置

    CSS3 GENERATOR可以同时为一个元素完成border-radius.box-shadow.gradient和opacity多项属性的设置 CSS3 GENERATOR 彩蛋爆料直击现场 CS ...

  7. 使用mingw编译完整Qt5的过程(使用了niXman的msys套装)good

    使用mingw编译完整Qt5的过程 坛子里似乎已经有人编译出Qt5了,不过大多有问题,不是缺少opengl就是缺少openssl,还有缺少webkit的,本文提供的仍然不能说是绝对完整的,不过相对以前 ...

  8. <iOS 导航栏>第一节:导航栏透明方法实现代码

      说下导航栏的透明方法:   很多应用需要导航栏随着向上滑动,逐渐从透明变成不透明,很炫酷,大部分应用都在使用导航栏渐变效果,现附上代码然后直接将实现,一会讲下如何来实现,这一部分直接上代码.   ...

  9. BFS提高效率的一点建议

    BFS有两种常见的形式: 形式1: 把初始点加入队列; while (队列非空) { 取出队头; 操作取出的点; 寻找周围符合条件的点加入队列; } 形式2: 操作初始点 把初始点加入队列; whil ...

  10. 这里有123个黑客必备的Python工具!

    123个Python渗透测试工具,当然不仅于渗透~ 如果你想参与漏洞研究.逆向工程和渗透,我建议你时候用Python语言.Python已经有很多完善可用的库,我将在这里把他们列出来. 这个清单里的工具 ...