通过多粒度表达式,搞定各种复杂报表

作者: 永洪科技  来源: 原创  时间:2019年12月16日

最近在我们的官方论坛——永洪社区,经常收到一些私信,吐槽在数据分析过程中老板、客户总是提很多新的需求,比如要对数据进行多维度分析。我们把报表、ppt做美观已经很难了,这种复杂报表需求该如何实现?

不是需求太难,只是我们不会用多粒度表达式。其实,老板、客户的需求没有问题,做数据分析就是要对数据进行深入分析,发掘数据背后的价值。今天就给大家讲讲多粒度表达式,永洪科技的黑科技数据分析工具,可满足复杂报表的各种问题。


概念介绍

什么是多粒度表达式?

多粒度表达式,顾名思义,是一个表达式,那为什么叫多粒度呢?先来解释下,什么是粒度,其实表达式存在的目的就是用来计算,而计算可能会有不同的计算场景,所以计算的方式也是不同的。多粒度表达式的粒度,我们可以理解成一种计算的方式。例如,我们希望在计算的同时能排除掉另一维度对当前这个字段的影响,或者希望对当前这个字段进行计算的同时又能包含其他维度等类似的计算,多粒度就是指我们对于这样的计算可以有多种类型。它的存在是为了解决一些复杂计算,或者说给出一种更便捷的计算方式,相比以前的表达式,它的强大之处在于,可以仅通过一个式子就达到以前需要用多个表达式进行复杂调用的效果,另一方面,表达式的过多使用是会影响系统的性能的,现在一个多粒度表达式就能更加方便快捷的实现,所以从另一方面也是对系统性能进行了优化。

实践场景应用

“光说不练假把式”,话不多说,直接上问题,看下多粒度表达式在具体的问题场景中应该如何使用,这样我们可以更快的领会到其中的意思。

1、固定维度表达式——Fixed

► 问题场景:客户订单表,字段包括了客户id、订单id、物品名称、订单数等字段,目前的需求是想要计算出一个订单的客户数、两个订单的客户数、三个及多个订单的客户和客户数。

 

▷ 思路分析:看到这样的需求,我们首先想到的是可以根据产品id进行不同值计数,同时根据客户id也进行不同值计数,但现在的问题是如何做到既要对客户进行分组又要对订单数也进行分组,只通过以往表达式是实现不了这样的效果。这个时候,多粒度表达式就可以派上用场了,Fixed,它可以做到对一个字段进行分组的同时对另一个字段也进行计算此表达式使用指定的维度计算值,而不引用组件中的任何其他维度。 

语法:
Fixed ([dim1[,dim2]...]::aggregate-expression]) 
dim1,dim2----数据列
aggregate-expression---聚合表达式

例如:  
Fixed(col['procuct']::Sum(col['sales']))

对于这个问题,只需要一句表达式就可以解决了,fixed(col['Customer ID']::DistinctCount(col['Order ID'])),新建表达式如下:
              

这个表达式的意思就是根据客户id,对订单进行不同值计数,这样就可以看到不同客户订购了多少产品。结果如下:
 

从这个报表中,就可以很明显的看到订购了一个、两个、三个的客户有哪些了。怎么样,是不是很简单,其实fixed它的作用就是按照某个字段对另一个字段进行计算,比如上面的问题,如果我还想看下不同客户的订单的金额是多大,同样也可以用fixed,fixed(col['Customer ID']::Sum(col['Order ID']))也能轻松解决。接下来我们再看看其他的多粒度表达式是怎么用的。

2、排除维度表达式——Exclude

► 问题场景:现有一张咖啡表,包含了产品种类、产品名称、利润等字段,现在想同时看到不同产品、不同种类的产品的利润,两者之间能有个直接的对比,用柱状图呈现。
▷ 思路分析:对于这个需求,我们先想到的是将产品种类和产品名称直接绑定到x轴或y轴,再将利润绑到另一个轴,然而这样的操作后实现的效果是这样的,实现不了我们的需求
 

那如果把产品种类和产品名称换下位置呢?效果是这样的:
操作结果发现,这样还是不行。其实,我们可以发现,报表展示的数据和绑定字段的位置是有关系的,它是根据字段的位置来进行扩展,进行计算展示的。

通过测试,两种方式都不能满足我们的需求。那能不能排除掉绑定的一个字段的影响,把产品名称的利润单独计算,不受前面的产品种类的影响,不按照它来扩展呢?这时候我们的排除表达式Exclude就派上用场了,此表达式使用指定的维度以及组件中的任何维度来计算值。 

语法:
Include ([dim1[,dim2]...]::aggregate-expression]) 
dim1,dim2----数据列
aggregate-expression---聚合表达式

例如:
Include(col['procuct']::Sum(col['sales']))此表达式从组件细节级别中减去维度来计算值。新建表达式,如下:

 

绑定后的效果如下:

怎么样是不是很神奇?对不同种类的产品和不同产品的利润都进行了展示,两者间可以进行清楚的展示和对比,排除表达式的作用就是排除一个字段的影响对另一个字段进行计算。接着看下最后一个多粒度表达式,包含维度表达式——Include。

 3、包含维度表达式——lnclude

问题场景:现有一张咖啡表,包含了产品种类、产品名称、利润、年份等字段,需求是计算每年所有产品种类的平均利润是多少。

▷ 思路分析:对于这个问题,计算方法是用每年的利润总和除以产品种类数,于是肯定有人会先绑定年份,再绑定利润,然后计算平均值。效果是这样的:


但这个数值对吗?它是不正确的,这个计算的是2015年和2016年每年的总利润的平均利润,它是用每年的利润总和除以每年所有销售的产品总数,而不是所有种类的平均利润,我们不妨再拖入一个表格看下是不是这样的。

通过上面的计算,发现上面柱状图的平均利润确实是用总和除以所有订单数,这个计算的是所有产品的平均利润,而不是所有产品种类的平均利润,我们可以先看下产品种类数:

 

从表中可以看到产品种类数是4,所以用每年的利润总和除以4,得到的就是每年所有产品种类的平均利润。这里有两种方式进行计算,方式如下:

  •  方式一:用我们的聚合表达式,先对利润计算总和然后对产品种类进行不同值计数,再相除,效果如下:


  • 方式二:通过包含维度表达式——Include

上面已经对FixedExclude两个多粒度表达式介绍完了,这里要介绍的包含维度表达式——Include,就是对一个维度进行计算的同时要考虑到另一个维度的影响,或者说是指定维度来对其他维度进行计算。

语法:
Include ([dim1[,dim2]...]::aggregate-expression]) 
dim1,dim2----数据列
aggregate-expression---聚合表达式

例如:
Include(col['procuct']::Sum(col['sales'])) 此表达式从组件细节级别中减去维度来计算值。新建表达式如下:
   

通过包含维度表达式——Include,也能实现准确的计算,这个表达式的意思是指定产品种类这个维度,然后对利润求总和,而且它比较灵活,相比只用聚合表达式,如果我们需求变成要计算每年所有产品利润,只需将度量从平均换成总和就可以了。


总结

通过上面三个问题场景的介绍,想必大家对多粒度表达式都有一些概念了,也了解到了在什么情况下可以使用多粒度表达式,这里再进行总结下。

指定维度表达式 Fixed: 可能比视图计算更粗略或者精细。取决于视图上绑定的维度和表达式本身的维度。
排除维度表达式 Exclude:可能比视图级别的粒度更粗略,排除其他维度的影响。 
包含维度表达式 Include:可能比视图级别的粒度更精细。例如在最后的案例中,我们可以清晰的看到视图上,没有产品种类的维度,但是我们可以将涉及产品种类的利润算出来。 

介绍这么多,以后再遇到复杂报表需求,用多粒度表达式就对了,这3个多粒度表达式可以说能满足我们日常报表中的各种复杂问题。另外,以上文中的操作展示使用的是我们的桌面智能数据分析工具——Yonghong Desktop,真的是操作简单易上手!

 

版权声明

 

永洪BI
更敏捷、更快速、更强大

申请试用
Copyright © 2012-2020 北京永洪商智科技有限公司
京ICP备12050607号 京公网安备110110802011451号