[已解决] 关于Calculate函数的嵌套使用方法

  [复制链接]
查看218982 | 回复170 | 2021-2-18 19:41:22 | 显示全部楼层 |阅读模式
Calculate函数,返回指定上下文计算值的函数。
如下两个DAX,一个是Calculate+Filter+Filter,另一个是Calculate+Filter再嵌套一个Calculate+Filter。

问题是,前一个返回了正确的结果,但嵌套的却返回了错误的结果。

个中原因,还请指点。

谢谢。


  1. 当月注册且购买 =

  2. CALCULATE(

  3.   DISTINCTCOUNT('客户'[客户ID]),

  4.   FILTER('客户',[销售额]>0),

  5.   FILTER('客户',

  6.   YEAR('客户'[注册日期])=[年份]

  7.   &&MONTH('客户'[注册日期])=[月份]

  8.   )

  9. )
复制代码
  1. 当月注册且购买_嵌套 =

  2. CALCULATE(

  3.   CALCULATE(

  4.   DISTINCTCOUNT('客户'[客户ID]),

  5.   FILTER('客户',[销售额]>0)

  6.   ),

  7.   FILTER('客户',

  8.   YEAR('客户'[注册日期])=[年份]

  9.   &&MONTH('客户'[注册日期])=[月份]

  10.   )

  11. )
复制代码


10865111524501.png
10865111524508.zip (596 KB, 下载次数: 0)
回复

使用道具 举报

阿星 | 2021-2-18 19:49:22 | 显示全部楼层
应该这样去嵌套吧
  1. 当月注册且购买_嵌套 =

  2. CALCULATE (

  3.   DISTINCTCOUNT ( '客户'[客户ID] ),

  4.   FILTER (

  5.   FILTER ( '客户', YEAR ( '客户'[注册日期] ) = [年份] && MONTH ( '客户'[注册日期] ) = [月份] ),

  6.   [销售额] > 0

  7.   )

  8. )
复制代码
回复

使用道具 举报

wangzig | 2021-2-18 19:52:22 | 显示全部楼层
你又把变量用在calculate的第一参了,好像不是第一次这么干了,公式没改,找图片中的上下文吧,cal加条件,在第3,第4参数加就可以了 10865111524502.jpg
回复

使用道具 举报

真少爷 | 2021-2-18 19:57:22 | 显示全部楼层
应该这样去嵌套吧


感谢指点,两种写法返回的值是完全一样的。

  1. CALCULATE(

  2.   DISTINCTCOUNT('客户'[客户ID]),

  3.   FILTER('客户',[销售额]>0),

  4.   FILTER('客户',

  5.   YEAR('客户'[注册日期])=[年份]

  6.   &&MONTH('客户'[注册日期])=[月份]

  7.   )

  8. )
复制代码
回复

使用道具 举报

yuanliwuyan | 2021-2-18 20:04:22 | 显示全部楼层
你又把变量用在calculate的第一参了,好像不是第一次这么干了,公式没改,找图片中的上下文吧,cal加条件,在 ...


这次还真没有用VAR

如图,新增了一个用VAR写的度量值,返回的值和购买客户完全一致(第一参数用VAR后,任何Filter都可以无视)。

另外,又新增了男女会员两个度量值。如图同样是嵌套,男女会员返回的值完全正确,当月注册返回的值就是错误。
  1. 购买客户_当月注册_嵌套_VAR =

  2. VAR _Number =

  3. CALCULATE(

  4.   DISTINCTCOUNT('客户'[客户ID]),

  5.   FILTER('客户',[销售额]>0)

  6. )

  7. Return

  8. CALCULATE(

  9.   _Number,

  10.   FILTER('客户',

  11.   YEAR('客户'[注册日期])=[年份]

  12.   &&MONTH('客户'[注册日期])=[月份]

  13.   )

  14. )
复制代码
  1. 购买客户_当月注册_嵌套 =

  2. CALCULATE(

  3.   [购买客户_All],

  4.   FILTER('客户',

  5.   YEAR('客户'[注册日期])=[年份]

  6.   &&MONTH('客户'[注册日期])=[月份]

  7.   )

  8. )
复制代码
  1. 购买客户_男_嵌套 =

  2. CALCULATE(

  3.   [购买客户_All],

  4.   FILTER('客户',

  5.   '客户'[性别]="男"

  6.   )

  7. )
复制代码



10865111524503.png
10865111524509.zip (595.74 KB, 下载次数: 0)
回复

使用道具 举报

天天压马路 | 2021-2-18 20:09:23 | 显示全部楼层
把影响的列,去掉,至于,var定义的变量,只在计算的它的时候考虑筛选条件,一旦计算完成,就可以把它当成一个常量来看,想通过改变筛选条件,重新计算这个变量,应该行不通
10865111524504.jpg
回复

使用道具 举报

燕燕子 | 2021-2-18 20:15:23 | 显示全部楼层
还是没理解上下文,嵌套的,内部的筛选上下文覆盖了外层的,因为Filter的是整个表
----------------这种说法不严谨,有待商榷,请大家无视。

10865111524505.png 内层cal,FILTER第一参数,只用一列,不用全表,结果正确。
我也搞不清楚原理。
意大利人的金律:尽量少用全表做为筛选器,最好是单列。
回复

使用道具 举报

srici_yb | 2021-2-18 20:18:23 | 显示全部楼层
还是没理解上下文,嵌套的,内部的筛选上下文覆盖了外层的,因为Filter的是整个表



受教了,谢谢。
  1. 购买客户_当月注册_嵌套 =

  2. CALCULATE(

  3.   CALCULATE(

  4.   DISTINCTCOUNT('客户'[客户ID]),

  5.   FILTER('客户',[销售额]>0)//最内层的Filter覆盖了外层的Filter

  6.   ),

  7.   FILTER('客户',

  8.   YEAR('客户'[注册日期])=[年份]

  9.   &&MONTH('客户'[注册日期])=[月份]

  10.   )

  11. )
复制代码
回复

使用道具 举报

wpq88 | 2021-2-18 20:24:23 | 显示全部楼层
还是没理解上下文,嵌套的,内部的筛选上下文覆盖了外层的,因为Filter的是整个表


@wdx223,@libo5563,@gavin.w,几位好!我觉得这个问题似乎没那么简单,经反复试验,有这样一个情况,让我百思不得其解,特向几位讨教,还望指点一二!
只要'日期'[日期]SLICER有任何筛选,哪怕是日期范围比整个'日期'表少一天,都无法得到正确结果!
10865111524506.png


而一旦清除这个SLICER的筛选,结果就正常了!
10865111524507.png

我抓耳挠腮琢磨了一晚上,没分析出这个SLICER在计算过程中为什么产生这么大的影响。。。
  1. 当月注册且购买_嵌套 =

  2. CALCULATE (

  3.   CALCULATE ( DISTINCTCOUNT ( '客户'[客户ID] ), FILTER ( '客户', [销售额] ) ),

  4.   FILTER ( '客户', YEAR ( '客户'[注册日期] ) = [年份] && MONTH ( '客户'[注册日期] ) = [月份] )

  5. )
复制代码
回复

使用道具 举报

lmwyjlky | 2021-2-18 20:27:24 | 显示全部楼层
@wdx223,@libo5563,@gavin.w,几位好!我觉得这个问题似乎没那么简单,经反复试验,有这样一个情况,让 ...


参考我在7楼的回复,更新了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则