总计不等于明细之和的解决办法
上一篇文章最后留了个问题,就是计算大于2000万的城市销售额时,总计金额不等于明细之和,看起来比较奇怪,
其实总计和上面的这两个数字都有自己的逻辑,分别代表不同的上下文环境中的销售额,按照常规的汇总逻辑来理解二者关系是没有意义的。但是为了避免误导,有时还是需要避免出现这种状况,这里有两个解决的思路,
(一)明细项目和总计项目不同时显示
(二)让总计额等于明细项之和
下面按这两种思路分别来解决。
(一)明细项目和总计项目不同时显示
也即是让明细项的金额为空值,或者让总计为空值,这里要用到一个新函数:HASONEVALUE,是个逻辑判断函数,如果有单一值,返回ture,否则返回false,具体语法如下:
HASONEVALUE(<columnName>)
参数只有一个:列名,
作用:判断外部上下文中是否为该列中的唯一值,做切片器交互时十分有用。
下面就看看这个函数如何解决上面的问题。
不同时显示又分为不显示总计值和不显示明细项的值
不显示明细项的值
新建度量值[方法1]
= IF(HASONEVALUE('产品明细'[产品名称]),
BLANK(),
[大于2000万的城市销售金额])
这个度量值的意思是,如果外部上下文在[产品名称]中,用空值表示,否则运算度量值,结果显示如下,
如果只想要销售额大于2000万的城市的汇总销售金额,可以用这种方法。
不显示总计值
如果想要总计值为空,和上面的度量值类似,BLANK换个位置就行了,新建度量值[方法2],
= IF(HASONEVALUE('产品明细'[产品名称]),
[大于2000万的城市销售金额],
BLANK())
结果如下,和我们期望的一致。
(二)让总计额等于明细项之和
实现这种方式还需要再放出一个函数:SUMX.
SUMX(<table>, <expression>)
第一个参数为被运算的表table第二个参数是对表中的每一行计算的表达式
之前也提到过,这是一个迭代函数,可以对表进行逐行运算,用该函数建一个度量值[方法3],
= SUMX('产品明细',
[大于2000万的城市销售金额])
结果如下,总计正好等于明细项之和,
SUMX函数十分强大,有的时候甚至可以代替CALCULATE,比如用SUMX可以一步实现方法3的效果,而无需借助CALCULATE建立的度量值 [大于2000万的城市销售金额]。
使用SUMX新建度量值[SUMX方法],
= SUMX('产品明细',
SUMX(FILTER('门店城市',
[销售总额]>20000000),
[销售总额]))
结果如下,
通过SUMX嵌套实现的效果和之前的方法完全一致,其中内层嵌套的SUMX公式和之前用CALCULATE建的度量值是等效的。不过SUMX的计算原理是逐行运算,如果数据量特别大,这种方式对内存的消耗比较严重,使用这种方式候需要慎重。
通过以上这几种方法,实现了总计和明细之和不相等的问题,实际分析中遇到相似的情况,可根据具体逻辑关系和展现需求选择不同的方式来处理。
提升技能 开拓视野