美文网首页
“横向取总和,纵向取平均,角落取总值”的烧脑题

“横向取总和,纵向取平均,角落取总值”的烧脑题

作者: 扫地sir | 来源:发表于2020-08-18 16:22 被阅读0次

    在知乎上看到Michael Ye写的一篇《一道烧脑的Tableau面试题》,特别吸引了我。

    https://zhuanlan.zhihu.com/p/96494410

    这道题很有挑战,一开始我看到也是一头雾水,完全不知道怎么做,但是看完大神讲解,大致就理解了思路,作者已经提供了三种计算方法。后来发现这个题目和WOW2020 Week29的挑战有相通之处,也可以用挑战中用到的SIZE函数来解决。

    http://www.workout-wednesday.com/2020w29/

    所以我按照大神的解题思路,用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结果来学习。

    http://www.workout-wednesday.com/

    另外,还要推荐喜乐君的书《数据可视化分析:Tableau原理与实践》,国内最好的讲述Tableau原理的书,想进阶Tableau的必读书目。

    此篇文章已发布到我的公众号: saodisir,有兴趣也可关注一下

    相关文章

      网友评论

          本文标题:“横向取总和,纵向取平均,角落取总值”的烧脑题

          本文链接:https://www.haomeiwen.com/subject/epfkjktx.html