DAX 第二篇:计算上下文
计算上下文是计算公式的环境,任何DAX表达式都是在上下文中求值的。行上下文和筛选上下文是DAX中仅有的上下文类型,把这两种上下文称为计算上下文。计算上下文用于限定公式计算的环境,当上下文变化时,相同的公式会计算出不同的结果。
一,计算上下文
在PowerBI中创建的计算列是在行上下文中执行计算,创建的度量(meassure)是在筛选上下文中执行计算。
- 行上下文是一个总是包含一行的上下文,DAX在创建计算列时自动定义行上下文。
- 筛选上下文是由切片器(Slicer)、用户选择的分组字段、关系的筛选方向等过滤器共同定义的,而DAX利用筛选上下文来计算公式(度量)。
二,行上下文
行上下文仅仅存在于表的同一行中,作用是对表中同一行的不同列,应用公式,逐行计算出公式的结果。
例如,创建一个计算列 Profit,利润的公式是由商品的 销售额 - 税额 - 成本 - 运费,DAX公式如下所示:
Profit = FactSales[SalesAmount]-FactSales[TaxAmt]-FactSales[TotalProductCost] - FactSales[Freight]
DAX逐行应用公式,对于表中每一行,都会根据公式,把同一行上的不同列的值代入到公式中,计算出公式的结果:
实际上,用于执行计算的行并没有存储在公式中,而是定义在行上下文中。从逻辑的角度来讲,计算列的工作流程是:
- 当你定义计算的列时,DAX从表的第一行开始迭代,首先创建了包含该行的行上下文并对表达式求值,
- 然后它移到第二行,再次求出表达式;
- 这发生在表格中所有的行中,如果你有100万行,你可以认为DAX创建了100万行上下文来评估这个公式100万次。
三,筛选上下文
创建的度量在筛选上下文中执行公式的计算,筛选上下文是对表应用过滤器之后,数据被筛选之后的上下文。筛选上下文是由过滤器共同作用的,过滤器主要有:切片器(Slicer),分组列和关系。DAX的强大之处在于,DAX不仅能够自动应用筛选上下文,还支持修改、清除和重定义筛选上下文。
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来统计用户的数量:
Measure CountCustomer = CALCULATE(COUNT(DimCustomers[CustomerKey]))
测试的结果是 Measure CountCustomers的值是DimCustomers表的总数量,也就是说,ProductKey不能过滤DimCustomers表。
当把DimCustomer和FactSales之间的关系修改为双向时:
用于FactSales可以过滤DimCustomers,DAX自动应用筛选上下文,统计每个ProductKey对应的客户数量:
3,修改、清除和重定义筛选上下文
使用DAX函数可以修改、清除和重定义筛选上下文。CALCULATE()函数是DAX中最复杂的函数,用于计算由指定过滤器修改的上下文中的表达式。
CALCULATE(<expression>,<filter1>,<filter2>…)
第一个参数是用于计算聚合值的度量,后面的参数是可选的过滤器,共有两种类型:
- 返回布尔值的逻辑表达式
- 返回表的表达式
CALCULATE函数的复杂之处在于可变的数据上下文。如果数据已被过滤,则CALCULATE函数会更改过滤数据的上下文,并在您指定的新上下文中计算表达式。 对于filter参数中使用的每个列,将删除该列上的任何现有过滤器,并应用filter参数中使用的过滤器。
参考文档:
DAX 第二篇:计算上下文的更多相关文章
- 第二篇 界面开发 (Android学习笔记)
第二篇 界面开发 第5章 探索界面UI元素 ●The Android View Class ●△Widget设计步骤 需要修改三个XML,以及一个class: 1)第一个xml是布局XML文件 ...
- 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- (转)从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
原文地址: http://www.cnblogs.com/lyhabc/p/4682028.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集 ...
- 深入理解javascript对象系列第二篇——属性操作
× 目录 [1]查询 [2]设置 [3]删除[4]继承 前面的话 对于对象来说,属性操作是绕不开的话题.类似于“增删改查”的基本操作,属性操作分为属性查询.属性设置.属性删除,还包括属性继承.本文是对 ...
- 前端工程师技能之photoshop巧用系列第二篇——测量篇
× 目录 [1]测量信息 [2]实战 [3]注意事项 前面的话 前端工程师使用photoshop进行的大量工作实际上是测量.本文是photoshop巧用系列第二篇——测量篇 测量信息 在网页制作中需要 ...
- 【OpenGL】第二篇 Hello OpenGL
---------------------------------------------------------------------------------------------------- ...
- Python开发【第二篇】:初识Python
Python开发[第二篇]:初识Python Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏 ...
- RabbitMQ学习总结 第二篇:快速入门HelloWorld
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- 第二篇 Integration Services:SSIS数据泵
本篇文章是Integration Services系列的第二篇,详细内容请参考原文. 简介SSIS用于移动数据.数据流任务提供此功能.因为这个原因,当介绍SSIS时我喜欢从数据流任务开始.数据流任务的 ...
随机推荐
- Xdite:永葆热情的上瘾式学习法(套路王:每天总结自己,反省自己的作息规律,找到自己的幸运时间、幸运方法,倒霉时间、倒霉方法。幸运是与注意力挂钩的。重复才能让自己登峰造极,主动去掉运气部分来训练自己。游戏吸引自己的几个原因非常适合训练自己)good
版权声明 本文首发自微信公共帐号: 学习学习再学习(xiaolai-xuexi) 无需授权即可转载, 甚至无需保留以上版权声明: 转载时请务必注明作者. 以下是<共同成长社区>第 58 次 ...
- mysql自动化安装脚本(二进制安装)
为了日后安装数据库方便,遂写了一个自动安装MySQL的脚本: 测试可以安装mariadb和MySQL-5.7.X 安装前配置好对应的my.cnf文件放在/tmp路径下 将启动脚本mysql3306放在 ...
- ORACLE RAC+OGG配置
实验环境主机名 IP地址rac01 192.168.56.10rac02 192.168.56.20rac-scan 192.168.56.30 目标库:ora-ogg 192. ...
- UWP入门(二) -- 基础笔记
原文:UWP入门(二) -- 基础笔记 不错的UWP入门视频,1092417123,欢迎交流 UWP-04 - What i XMAL? XAML - XML Syntax(语法) ,create i ...
- 用vs2010编译好的ICU库
1.ICU库的官网网址为http://site.icu-project.org/ 2.ICU(International Components for Unicode)是一个国际化的字符编码和转化的库 ...
- 深入windows的关机消息截获-从XP到Win7的变化(在XP中程序可以阻止关机,但是在Win7中程序无法阻止关机,可Block的时间从1秒调到了5秒) good
之前写了一个软件用于实验室的打卡提醒,其中一个重要的功能是在关机之前提醒当天晚上是否已经打卡.之前我是在WM_ENDSESSION中弹出一个模态对话框来提醒,在XP中基本工作正常,在Win7中大多数时 ...
- ubuntu QT开发环境(三种方法安装Qt4.8,其中apt-get方法安装QT库最简单)good
方法一 QT4.8.0库+QT Creator 2.4.1 特别声明:此方法极其耗时间,看电脑性能了.配置configure可减少编译时间 1.下载Qt .进入网址http://qt.nokia.co ...
- 【原创】ABAP根据文件路径获取文件所在目录(续)
在上一篇文章<ABAP根据文件路径获取文件所在目录>中,我主要的思路是采用 “SPLIT dobj AT sep INTO TABLE result_tab” 句型将文件全路径按分隔符“\ ...
- C语言实现常用数据结构——二叉树
#include<stdio.h> #include<stdlib.h> #define SIZE 10 typedef struct Tree { int data; str ...
- java多线程之多生产者-多消费者
多生产者和多消费者是线程通信的经典案例,但是和生产者-消费者相比更为复杂,而且可能会产生程序假死. public class Product { private MyStack myStack; pu ...