ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 关于TreatAs函数正确的使用方式

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-12-2 22:33 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 gavin.w 于 2020-12-4 10:13 编辑

TreatAs的官方解释是,将表表达式的结果作为筛选器应用于无关表中的列。

本示例中,已取消维度表“日期”与事实表“订单”之间的关系,并编写了三个度量值。

1、销售额_All,想通过All来取消日期的筛选上下文(2011年至2014年4年的销售额),奇怪的是实际返回的还是有筛选上下文(等同销售额),最奇怪的是总计却是正确的;
2、销售额_All_VAR,想通过VAR来方便阅读,但无论行标签还是总计,返回的都等同销售额。

以上,还请各位大佬指点:

1、如何才能取消筛选上下文?
2、此处的VAR,是错在哪里?

谢谢。
EH_TreatAs.png

EH_TreatAs.zip

564.43 KB, 下载次数: 8

TA的精华主题

TA的得分主题

发表于 2020-12-3 05:14 | 显示全部楼层
你是不是对蓝框里16117xxx那个值是怎么来的感到奇怪?其实等会看完一些基本原理后,你一定会说:哦,就是这样呀,没什么好奇怪的。

针对这个度量值,你先回答几个基本的问题,后面会用的上。
  1. 销售额_All =
  2. CALCULATE(
  3. [销售额],
  4. ALL('日期'[日期])
  5. )
复制代码

1. 这里的ALL('日期'[日期])作用是什么?它得到的结果是什么?
2. 总计行的蓝框所在位置的计值上下文(EVALUVATION CONTEXT, EC)是什么?
(我声明一下:不是我愿意这样半中半英的说话,是因为我从学DAX第一天开始就是看的英文的材料,很多术语的中文翻译我不太确定;国内成体系的中文材料几乎没有)


参考答案:
1. 作为CALCULATE/CALCULATETABLE()所使用的filter modifier,ALL('日期'[日期])移除了'日期'[日期]上的所有筛选,即201401<='日期'[日期]<=201412的筛选在后续的计算中被无视,相当于'日期'[日期]没有任何筛选。这既是ALL('日期'[日期])在此的作用,又是结果。
对于ALLX一族(ALL, ALLEXCEPT, ALLSELECTED等)函数的深入解析可参考:
https://www.sqlbi.com/articles/managing-all-functions-in-dax-all-allselected-allnoblankrow-allexcept/

2. 这里首先可以肯定是没有行上下文了(ROW CONTEXT, RC);要看来自外部(FILTERS PANE里未隐藏的筛选、本页面里的切片器、来自其他VIZ)的筛选上下文(FILTER CONTEXT, FC),直接点这里就行:
image.png
我再多啰嗦一句,这个“总计”其实和上面分列的每一行半毛钱关系没有,它的计算根本就不是去把这些行总的计起来;它在自己的一亩三分地里(你标记的蓝色框所在的EC中)自己玩。(地区[国家]列是特意加进来当背景板说明外部筛选情况的,影响不到计算的结果,因为所有数据对应的国家都是中国)

这个时候再次把度量值进一步还原:
  1. 销售额_All =
  2. CALCULATE ( //1
  3.     CALCULATE ( //2
复制代码
结合上面那几个基本问题,我想你应该也明白得七七八八了吧。我们一起理一下:
1. CALCULATE 1先把蓝框的EC都全部转化成FC,2014/1/1<='日期'[日期]<=2014/12/31;
2. CALCULATE 1里的ALL('日期'[日期])把1里的筛选又移除了;落得白茫茫一片大地真干净,CALCULATE 2省事了;
3. CALCULATE 2里TREATAS()建立虚拟关系,用VALUES ( '日期'[日期] )的结果筛选'订单'[订单日期]。刚才2里就说了,'日期'[日期]上的筛选已被移除,VALUES ( '日期'[日期] )就应该是这一列所有不重复值了(如果不放心,可以另外用度量值CALCULATE( COUNTROWS( VALUES('日期'[日期]) ), ALL( '日期'[日期] ) )验证一下),筛选完'订单'[订单日期]后一累加,就是最后结果了。

其实没什么特别的,就是这样了。其他的度量值分析也大同小异。

既然说到这里了,我就在提一句建议,被引用的度量值,计量不要再含CALCULATE/CALCULATETABLE,因为多一次出现,就意味着多一次上下文转换,即又增加了复杂度,DEBUG的难度也随之增加一层。生活已经不易,就不要再给自己添麻烦了。。。

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-12-3 13:50 | 显示全部楼层
把变量结果用在CALCULATE的第一参数,这时候有必要再重新学一下DAX

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-12-3 20:48 | 显示全部楼层
wdx223 发表于 2020-12-3 13:50
把变量结果用在CALCULATE的第一参数,这时候有必要再重新学一下DAX

一语中的,受教了

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-12-3 23:12 | 显示全部楼层
ThxAlot 发表于 2020-12-3 05:14
你是不是对蓝框里16117xxx那个值是怎么来的感到奇怪?其实等会看完一些基本原理后,你一定会说:哦,就是这 ...

非常专业,膜拜一下。

又尝试写了两个度量值,去年和YTD的销售额,但返回的值还是不对。

小弟愚钝,还望大佬再次指点。

谢谢。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-12-3 23:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
补上附件,请大佬赐教。
EH_TreatAs_V2.0.png

EH_TreatAs_V2.0.zip

564 KB, 下载次数: 4

TA的精华主题

TA的得分主题

发表于 2020-12-4 08:43 | 显示全部楼层
gavin.w 发表于 2020-12-3 23:14
补上附件,请大佬赐教。

时间智能函数,需要标记日期表

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-12-4 18:15 | 显示全部楼层
本帖最后由 ThxAlot 于 2020-12-4 22:14 编辑
gavin.w 发表于 2020-12-3 23:14
补上附件,请大佬赐教。

销售额_LY全部为空的原因很简单,日期在多重筛选后,结果为空。

虽然你用DATEADD('日期'[日期],-1,YEAR)取得了前一年的日期区间,但是你不能忽略,用作行标签的'日期'[年月]的筛选还是存在,很明显这两个筛选叠加后的结果就是空。

你可以直接在度量值里把'日期'[年月]的筛选移除,应该就是你希望的结果了。
  1. 销售额_LY =
  2. CALCULATE ( [销售额], DATEADD ( '日期'[日期], -1, YEAR ), ALL ( '日期'[年月] ) )
复制代码

YTD那个度量值修改方法也一样。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-12-5 14:42 | 显示全部楼层
ThxAlot 发表于 2020-12-4 18:15
销售额_LY全部为空的原因很简单,日期在多重筛选后,结果为空。

虽然你用DATEADD('日期'[日期],-1,YEA ...

一题可以多解,受教了。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 16:17 , Processed in 0.041072 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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