在知乎上看到Michael Ye写的一篇《一道烧脑的Tableau面试题》,特别吸引了我。
这道题很有挑战,一开始我看到也是一头雾水,完全不知道怎么做,但是看完大神讲解,大致就理解了思路,作者已经提供了三种计算方法。后来发现这个题目和WOW2020 Week29的挑战有相通之处,也可以用挑战中用到的SIZE函数来解决。
所以我按照大神的解题思路,用SIZE函数尝试解题,也得到了相同的结果。强烈建议大家去看知乎这篇文章,理解作者的解题思路,才能在以后遇到问题时不慌张。
这道题的关键点就是如何确定分区,原文中第三种方法就是用COUNTD[Ship Mode]和COUNTD([Region])的值来确定分区,而SIZE函数本身就是确定分区中的行数,和COUNTD其实是同样的效果。
所以我创建了两个计算字段
size by region= SIZE()
size by ship mode=SIZE()
把两个字段拖到文本,[size by region] 计算依据选择[region],[size by ship mode]计算依据选择[mode]
看一下计算的结果:
这样就可以根据两个计算字段SIZE的值来判断不同的区域,从而来进行分类计算了。
但是这之前还需要新建一个计算字段
- LOD sum sales={ FIXED [Region], [Ship Mode]:SUM([Sales])}
因为视图的详细级别,是根据每笔明细来计算合计的,SUM函数结果是没有问题的,但是AVG的计算结果就是每笔订单的平均数,而不是1区里4个值的平均数,所以这里需要FIXED指定详细级别。
- text=
IF
//计算4区
[size by ship mode]=1 and [size by region]=1 then SUM([LOD sum sales])
//计算2区
ELSEIF [size by ship mode]=1 and [size by region]!=1 then AVG([LOD sum sales])
//计算1区和3区
ELSE SUM([Sales])
END
- 把[text]拖到文本,编辑计算表计算,[size by region] 选择特定维度只勾选[region],[size by ship mode]选择特定维度只勾选[ship mode]。
和上面的计算原理是一样的。
结果与原文一致,思路与原文第三种方法类似,略有不同。
写这篇文章主要是想说,条条大路通罗马,同样的问题在Tableau中可以用不同的方式来解决,但是都需要了解底层逻辑。顺便推荐一下WOW挑战,十分烧脑,只要能坚持几期,肯定会有收获。同样的挑战,每个人的解题思路都会有不同,非常锻炼技术。如果不会,还可以直接下载参与者的Viz结果来学习。
另外,还要推荐喜乐君的书《数据可视化分析:Tableau原理与实践》,国内最好的讲述Tableau原理的书,想进阶Tableau的必读书目。
此篇文章已发布到我的公众号: saodisir,有兴趣也可关注一下