最近白茶在读《圣经第二版》,再加上有很多小伙伴问过白茶总计栏显示不合理的地方,白茶决定抽出一期来描述一下上下文。

(坦白说,这个地方不太好说,因为白茶对于一些地方理解的也不是很到位,只能说是一家之言。小伙伴们权当白茶瞎咧咧就好,别去较真,也请各位大佬收起手中的大刀。)

先来看看本期的示例文件。

将其导入PowerBI中:

添加参数索引:

编写如下代码:

基础代码:

销售 =
SUM ( '示例'[销售金额] )

排名代码:

RANKX =
IF ( HASONEVALUE ( '示例'[客户] ), RANKX ( ALL ( '示例'[客户], '示例'[时间] ), [销售] ) )

TOPN排名代码:

TOPN =
IF ([RANKX] <= [移动平均 值],CALCULATE ( [销售], FILTER ( VALUES ( '示例' ), [RANKX] < [移动平均 值] ) )
)

看到这小伙伴们已经等着急了吧?来,看下面的结果:

小伙伴们,看明白没?

首先,左边的表,白茶放的是原始的数据文件,可以看得出来所有销售金额的总和是6822;而右边的TOPN随着参数切片器的变化而变化,但是右边的总计栏显示的不合理。

一会儿白茶会继续说,继续编写代码:

解决总计TOPN =
SUMX ( SUMMARIZE ( '示例', '示例'[客户], '示例'[时间] ), [TOPN] )

结果如下:

小伙伴们,这次看出来区别没?优化之后的结果总计栏显示的完全正确,那么问题出现在哪里呢?

其实这里面就涉及到DAX计算逻辑中的上下文概念了。

在圣经中曾提到过,DAX的计算逻辑有两种上下文:

行上下文与筛选上下文。

什么叫行上下文?

图片上原始数据,一行接着一行排列,这个就叫行上下文关系。说白了就是原始数据中存放的位置。

在这个图片中,TOPN的显示受到切片器的筛选影响,排名大于11的不显示,这个就是筛选上下文,因为有一部分数据不符合筛选要求被踢出去了。

在DAX语言中,行上下文与筛选上下文是一个特别重要的问题,我们在进行DAX代码编写的时候,必须要考虑到这两点,不然计算结果很容易出现问题。二者就是计算环境。

圣经中有句话说的特别好:

筛选上下文是对数据进行筛选,

行上下文是对表格进行迭代。

白茶的理解就是:

筛选不迭代,迭代不筛选!

这个东西可能有的小伙伴不太理解,其实单抽出概念,每一个字白茶都认识,但是实际写DAX的时候把这几个字放在一起就懵了。

在这段代码中,白茶利用IF使不符合条件的项目不显示,但是实际结果存在不?必然是存在的,不显示归不显示。这种情况下总计栏不会考虑你显示还是不显示的问题,它就知道,有,我就需要汇总,哪怕它看不着。

这段代码需要分开解释:

利用SUMMARIZE函数,构建了一个虚拟计算表,这个表显示的就是符合筛选条件的项目,按照**@冬哥**的解释就是,可见项目

[TOPN]为这个虚拟表提供了一些值,本身不符合筛选逻辑的值,直接就被PASS掉了。这里已经进行上下文转换了。

最后,SUMX只对总计生效。它只计算可见项目的可计算值。像是一些排名符合要求的组合,SUMMARIZE为它提供环境,[TOPN]提供值,由SUMX进行二者汇总。

这样的话,三者就完成了:

行上下文转换筛选上下文→提供筛选计算值→汇总计算

有时候写DAX经常因为上下文考虑的不周到,导致计算结果出问题,没有太好的解决办法,只能说经历的多了,写的DAX多了,才会慢慢让上下文这个概念长存于心。


小伙伴们❤GET了么?

白茶会不定期的分享一些函数卡片

(文件在知识星球[PowerBI丨需求圈])

这里是白茶,一个PowerBI的初学者。

下面这个知识星球是针对有实际需求的小伙伴,有需要的请加入下面的知识星球。

阅读圣经丨筛选上下文与行上下文相关推荐

  1. Power BI(二十一)power pivot之筛选上下文和行上下文

    Power BI(二十一)power pivot之筛选上下文和行上下文 其实上下文概念并不深奥,但是对于习惯使用Excel计算函数的亲们来说在学习这块知识时感觉会比较别扭,这主要是因为在Excel中, ...

  2. 阅读圣经丨测试上下文理解

    在<圣经2>中,关于上下文理解这一块,白茶看到两个有意思的小测试,决定分享给各位小伙伴. 这是一份销售数据,将其导入到PowerBI中. 结果如图. 现在开始进行问题描述. 问题一: 为数 ...

  3. 阅读圣经丨关于DAX(修订版)

    "基础不牢,地动山摇". 最近,有很多小伙伴和白茶在聊天,也会涉及到一些度量值的编写,经常能遇到说大脑当机的情况.比如说明明自己知道如何去写,但是大脑思维却停止运转,想不起来的情况 ...

  4. 【EARLIER/EARLIEST函数】引用不存在的更早的行上下文 报错解决

    引用@PowerQuery的例子并给予个人理解 X1= SUMX(FILTER('Data','Data'[订单日期]>EARLIER('Data'[订单日期])),[金额])---WRONG ...

  5. 命令行 上下文环境 与 相对路径

    命令行 上下文环境 与 相对路径 recognizer_unit_full |-------helpers |------bert_1.py |-------model |------best_mod ...

  6. 01-执行上下文与变量对象

    执行上下文 可执行代码 avaScript中可执行代码(executable code)分为三种:全局代码,函数代码和eval代码. 可执行代码与执行上下文的概念是相对的,在某些语义下,可执行代码与执 ...

  7. filter函数的用法_函数周期表丨筛选丨表丨CALCULATETABLE

    CALCULATETABLE函数 CALCULATETABLE函数属于"筛选"类函数,隶属于"表函数". 某种意义上来说,CALCULATETABLE函数其实就 ...

  8. 函数周期表丨筛选丨值丨CALCULATE

    ​CALCULATE函数 CALCULATE函数,被微软划分为"筛选"类函数,隶属于"值函数". 如果说ALLSELECTED函数是所有函数中最为复杂的一个,那 ...

  9. JavaScript作用域、上下文、执行期上下文、作用域链、闭包

      作用域.上下文.执行期上下文.作用域链.闭包是JavaScript中关键概念之一,是JavaScript难点之一,在应聘面试时必定会问到的问题,作为前端工程师必须理解和掌握.相信大家已经阅读了很多 ...

  10. R语言dataframe计算满足筛选条件的行的个数(筛选满足条件的数据行并计数):类似于excel的countif函数

    R语言dataframe计算满足筛选条件的行的个数(筛选满足条件的数据行并计数):类似于excel的countif函数 目录

最新文章

  1. 2021年大数据Spark(二十七):SparkSQL案例一花式查询和案例二WordCount
  2. 只因路由器密码太弱,IP被黑客利用发虐童图片,无辜夫妇:我们甚至想自杀...
  3. jQuery对下拉框、单选框、多选框的处理
  4. 基于sqlcmd命令行工具管理SQL server
  5. 感动哭!Starbreeze发布《收获日2》VR版
  6. Java进阶高级程序员必备:深入浅出springboot+深入Java虚拟机
  7. 《JavaScript设计模式与开发实践》模式篇(3)—— 代理模式
  8. mysql5.6.33安装教程_Linux下mysql5.6.33安装配置教程
  9. 1分钟 Zookeeper 快速入门_windows环境
  10. 苹果ios15.4RC版发布:新增口罩面容解锁功能
  11. android整合极光im与极光推送,极光IM + 极光推送,集成中遇到的问题
  12. 切图具体需要切什么内容_网页制作中的切图是什么?什么是切图
  13. vue中使用阿里矢量库彩色图标办法
  14. AppCode开发,一个智能开发环境
  15. linux 锐捷 自动,Ubuntu下锐捷自动认证设置
  16. Win10系统任务栏出现假死现象的解决办法
  17. vtk体绘制代码报错的解决办法(代码在vtk7,8,9中都能运行),以及VTK数据集网站
  18. 超详细!简单的物联网模块esp8266接入小爱爱同学控制电器(一)——控制开关灯
  19. js-打印1-100以内的质数(素数)
  20. 汇编语言AX,BX,CX,DX寄存器

热门文章

  1. java斐波那契数列_斐波那契数列(Java)
  2. 51单片机-直流电机
  3. matlab 四叉树表达,已知二值图像,如题图8.4所示。 (1)对该图像使用四叉树进行划分; (2)用四叉树表达该图像。 - 试题答案网问答...
  4. [十二省联考2019]希望
  5. CronTrigger 介绍
  6. 五金件常见问题01——2.普通螺纹与管螺纹
  7. 整理农行面试软开最常问到的题---------框架
  8. g4900 win7 核显驱动_INTEL WIN7核显驱动电脑端下载-支持8、9代CPU pc下载
  9. c语言开发蓝牙驱动 win7,ATK-hc05蓝牙串口模块驱动
  10. 100件不可思议的事