ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 784|回复: 5

[求助] calculate+filter的疑惑

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-11-21 17:43 | 显示全部楼层 |阅读模式
在矩阵中,显示总分大于250分的班级与同学。
成绩表是*端, 花名册是1端

总分 := SUM (成绩表[分数])
总分>250 1 := CALCULATE ([总分], FILTER('花名册', [总分] > 250))    --这个能得到正确的结果
总分>250 2 := CALCULATE ([总分], FILTER('花名册', SUM (成绩表[分数]) > 250))  --无法得到正确的结果

如图所示:
image.png

我的疑惑是,为什么在姓名这个维度上,[总分>250 2]能够正确筛选出大于250分的人。
按照我现有的理解,应该显示所有人的成绩才对呀,因为SUM (成绩表[分数]) > 250)对每一行都成立,而不是筛选出>250分的人。
image.png
image.png

TA的精华主题

TA的得分主题

发表于 2021-11-21 18:02 | 显示全部楼层
想要问问题的话,首先要学会怎么问问题;想要学会怎么问问题的话,首先要学会怎么添加附件。

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-21 18:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 bridge0321 于 2021-11-21 18:14 编辑
ThxAlot 发表于 2021-11-21 18:02
想要问问题的话,首先要学会怎么问问题;想要学会怎么问问题的话,首先要学会怎么添加附件。

好像没法直接上传pbix的文件。。。 忘记一直使用rar了,很久没逛论坛了   /尴尬

附件.rar

49.6 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2021-11-21 21:04 | 显示全部楼层
有几点需要搞清楚:
  • 在CALCULATE(expr, FILTER(...))结构中,FILTER部分的估值上下文是在CALCULATE()外层的上下文;
  • SUM('成绩表'[分数])是SUMX('成绩表', '成绩表'[分数])的syntactic sugar;
  • 在任何计算中,对表的引用(如2中的'成绩表')都不是单纯的全表了,而是经过当前筛选上下文筛选过后的表;


明确了这些,你再看看能不能想清楚目前的结果。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-11-22 10:22 | 显示全部楼层
[总分] > 250  等于 CALCULATE(SUM (成绩表[分数]) )>250

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-28 17:12 | 显示全部楼层
CALCULATE与CALCULATETABLE是DAX中唯二遇到嵌套先计算外层嵌套上下文的函数。

calculate函数,是在当前查询上下文基础上对筛选器参数进行计算。

所以,对于[总分>250 2]
1、当查询上下文是班级时,FILTER在班级筛选上下文的基础上,创建行上下文对'花名册'进行迭代(如查询上下文是1班时,意味着花名册中只有1班的人(表A),对表A进行迭代)。聚合函数忽略行上下文,所以得到的是每个班级的总分与250分作比较。
2、当查询上下文是姓名时,FILTER在姓名筛选上下文的基础上,创建行上下文对'花名册'进行迭代。聚合函数忽略行上下文,所以得到的是每个姓名的总分与250分作比较。得到看似能够对姓名筛选的值。
3、根据上述,易推得总计为什么是2365(3个班的总分)

对于[总分 > 250 1]
计算逻辑与[总分 > 250 2]相同,原因是两个都是度量值,只是FILTER中的计算参数不同。[总分 > 250 1]中FILTER的计算参数是度量值[总分],而FILTER创建了行上下文,度量值对该行上下文作了上下文转换。


这里的问题来自于孙兴华老师的《DAX火力全开》第9课,在此对孙兴华老师表示感谢,有需求的小伙伴可以上B站观看,是免费的。
但是,市面上大多数教学课程对于“计算列和度量值”,“行上下文与筛选上下文”的概念都没有做到从浅到深(包括这里孙兴华老师的免费入门课程)。如同这个案例,看似很简单,但是有非常多的花花道道,需要对计算列、度量值、CALCULATE的计值顺序以及上下文转换都有理解后,才能比较从容的梳理出逻辑。

在此,强烈推荐大家还是购买《DAX权威指南》作为入门。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 07:49 , Processed in 0.030738 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表