ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] EARLIER函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-10-27 10:05 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
表很简单,就是每个月得产品型号,要计算每月累计的产品有多少个,去除重复.


image.png

image.png

据说earlier可以做,就用ealier做了一个,遇到了earlier不存在更早上下文的问题,
=CALCULATE(DISTINCTCOUNT('区域'[PRODUCT]),FILTER(ALL('区域'[MONTH]),'区域'[MONTH]>=EARLIER('区域'[MONTH])))

翻阅资料后说加迭代可以解决,于是改成下面这个,结果貌似是对的,但完全倒过来了,4月的最少,1月最多
=CALCULATE(DISTINCTCOUNT('区域'[PRODUCT]),FILTER(ALL('区域'[MONTH]),SUMX(FILTER('区域','区域'[MONTH]<=EARLIER('区域'[MONTH])),'区域'[MONTH])))

于是我把<=改成>=,惊讶地发现对了,但我不明白为什么,比如3月,我需要筛选month(所有行)<=3月(earlier获取当前行),把1-3月的累加进来,那应该是'区域'[MONTH]<=EARLIER('区域'[MONTH])才对,为什么反而是>=才对,>=不是等于筛选3-4月的了吗?有没有大神可以解释一下啊.....


=CALCULATE(DISTINCTCOUNT('区域'[PRODUCT]),FILTER(ALL('区域'[MONTH]),SUMX(FILTER('区域','区域'[MONTH]>=EARLIER('区域'[MONTH])),'区域'[MONTH])))



TA的精华主题

TA的得分主题

 楼主| 发表于 2022-10-27 10:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
忘记贴附件,贴附件....

Test2.rar

47.27 KB, 下载次数: 8

TA的精华主题

TA的得分主题

发表于 2022-10-27 11:02 | 显示全部楼层
太复杂了,搞不太懂,用变量就可以小于等于了
  1. AP:=VAR M=MAX('区域'[MONTH]) RETURN CALCULATE(DISTINCTCOUNT('区域'[PRODUCT]),FILTER(ALL('区域'[MONTH]),'区域'[MONTH]<=M))
复制代码

TA的精华主题

TA的得分主题

发表于 2022-10-27 11:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 flashevil 于 2022-10-27 11:24 编辑

首先你搞清楚 sumx里的那个earlier 指向的是哪个行上下文:是上一层迭代 函数生成的 行上下文。 那么sumx的上一层迭代是谁? 是filter(all() ,的一参。这个行上下文 指代的是判断表的所有行
再来看SUMX里 earlier前面的那个【month】 ,这个month所处的是SUMX 生成的行上下文,而由于SUMX一参没有套ALL,一参被 矩阵的当前行筛选后 实际上是一个只有当前月的表,所以 这个mont 会返回一个标量值:当前的月份。
那么综合来看SUMX 的整个一参表达了个什么逻辑:
month>=earlier   ------>    当前月>=表的所有行  也就是  表中所有小于等于当前月的行

TA的精华主题

TA的得分主题

发表于 2022-10-27 12:17 | 显示全部楼层
思路是对的,把<=当前行月份的表迭代出来,再进行不重复计数。
度量值中把EARLIER换成SELECTIEDVALUE就行了
AccumulatedProduct :=
CALCULATE(
    COUNTROWS( DISTINCT( '区域'[PRODUCT] ) ),
    FILTER(
        ALL( '区域' ),
        '区域'[MONTH] <= SELECTEDVALUE( '区域'[MONTH] )
    )
)

TA的精华主题

TA的得分主题

发表于 2022-10-27 14:48 | 显示全部楼层
本帖最后由 ThxAlot 于 2022-10-27 14:50 编辑

DAX自从引入了VAR,EARLIER已经逐渐被取代;尤其是在写度量值的时候更是如此,因为度量值不像计算列,后者默认的初始估值上下文类型是行上下文。


本来可以简单写成
  1. DCNT =
  2. VAR __mth = MAX( '区域'[MONTH] )
  3. RETURN
  4.     CALCULATE( DISTINCTCOUNT( '区域'[PRODUCT] ), '区域'[MONTH] <= __mth )
复制代码
从去年开始的某个版本甚至都能直接写成
  1. DCNT = CALCULATE( DISTINCTCOUNT( '区域'[PRODUCT] ), '区域'[MONTH] <= MAX( '区域'[MONTH] ) )
复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-2 16:21 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-8 03:38 , Processed in 0.033340 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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