润乾报表、帆软报表、Smartbi、永洪 BI、亿信 BI 这几款国内产品都把中国复杂报表作为宣传点。我们以常见的多源分片为报表为用例,来对比评测这些产品的处理能力(由于时间和知识限制,个别很偏的功能点可能会有遗漏)。
内容比较长,如果不想看细节,可以直接跳到最后看结论。
报表式样
数据结构
[订单表]
主数据存储在订单表中,该表通过雇员 ID 和销售员表关联,通过产品 ID 和产品表关联。
[销售员表]
销售员表中存储职务、姓名,报表左下角统计数据时按照职务和姓名统计,该表通过雇员 ID 和订单表关联。
[产品表]
产品表中包含类别 ID 和产品 ID,并且是一对多关系,报表中需要按照类别分组,也就是要按该类别下多个产品的信息汇总。通过产品 ID 和订单表关联
[类别表]
这是一个中文字典表,通过它将类别 ID 映射成中文名称。
假定数据都来自数据库,可用 SQL 语句取出。
报表特点分析
1、 这是一个典型的多源分片报表,报表可以分成左上、右上、左下、右下四片区域,每片数据来自不同数据表(甚至可能不同数据库),需要实现多个数据集之间的关联。
2、 对字段数据的处理,数据库中存储的是订购日期,报表中需要按照年、月分组统计,需要根据日期解析出年、月,汇总区域是金额,数据库中存储的是单价、数量,需要对字段进行相乘操作。
3、 上表头中的产品类别需要按确定的次序排列,也就是维表 ID 的次序。
4、 左表头的层次不一样,上半两层,下半三层。
下面看下几款工具制作这个报表的过程和工作量。
关于工作量的评估,我们假定使用者均熟悉 SQL 语句且了解相应的报表工具,并只记录实际的制作和正常调试的时间,不包括查阅产品函数资料的时间,也就是一个熟手的完成时间。
制作过程
1、 配置并连接数据源,这个各个工具操作基本都类似,按照向导方式配置就行。
2、 设置数据集
润乾报表支持多数据集,本例的数据存储在四个表内,所以在报表中增加四个数据集,只要分别取四个表的数据(select * from …),可以通过向导操作。
3、 设计报表模板
多源分片报表是一个比较基础的中国式报表,国内报表工具基本都支持,这里看下几个关键单元格的设置:
3.1、 A3 单元格表达式:=ds1.group(year( 订购日期);year(订购日期):1)+“年”,需求中要求按照年月分组,而数据库中存储的是订购日期,所以此处先通过 year 函数取订购日期中的年份。
3.2、 D3 单元格:=ds1.sum( 数量单价 ),报表统计项中的金额是通过单价数量这两个字段生成。
3.3、 E2 单元格按照类别 ID 分组统计,但是要求这个单元格显示中文,单元格有个显示值表达式属性:
中文可以来自单独的一个数据集,这样通过内置的函数就可以将 id 映射成中文。
3.4、 E3 单元格:=ds1.sum(数量 * 单价, 产品 ID in ds4.select( 产品 ID)),多源分片最主要的要将多个数据源数据关联在一起,函数里边写入过滤条件就行,销售额在 ds1 数据集中,E2 单元格的类别来自 ds4 数据集,ds1 和 ds4 通过产品 ID 关联,ds4 中类别 ID 和产品 ID 是一对多的关系,所以此处关联用 in,这样报表右上方就能取出对应类别下的数据汇总。
3.5、 报表第四行表达式类似,主要是 ds1 和 ds3 数据集之间的关联,这里就不细说了。
3.6、 单元格边框、合并单元格,这些操作和 excel 中基本一致,按照需求设置就行。
运行结果
完成后点评
1、 用时 0.5 小时。
2、 常规设置和操作 excel 类似,再加上报表内的函数,制作起来很快。
3、 函数丰富,比如 =ds1.group(year( 订购日期);year(订购日期):1)+“年” ,对订购日期的年份进行分组,直接用 year 函数取年就行,不必对源数据集进行单独设置;类似地,=ds1.sum( 数量 * 单价) 数据由其他字段组合生成时,直接使用函数,不需要单独写 sql 语句等,这样只关心报表中几个函数的使用就行。
4、 多源关联方便,比如:=ds1.sum(数量 * 单价, 产品 ID in ds4.select( 产品 ID)),还是通过函数内置的一些功能实现,不用在数据集中处理,绝大多数操作都是在单元格函数中控制。
5、 产品类别用维表扩展(E2 格中用 ds2.group 根据类别 ID 分组),很容易保证次序,再设置显示值就能显示相应的中文名称。
6、 采用类 Excel 操作,布局、样式设置按照以前的思维处理就行,包括一些数据汇总等等。
7、 表达式基本上都是手填,虽然有表达式编辑界面,但还不如手填来得方便。
制作过程
1、 配置并连接数据源
2、 设置数据集
帆软报表支持单元格中的多数据集关联,在报表中新增四个数据集,分别对应 4 个数据表。但订单表的 SQL 特殊一点,先要用 单价 * 数量 as 销售金额,报表中要对销售金额汇总,金额来自单价和数量两个字段的乘积。因为在报表中没找到字段相乘汇总的办法,所以在取数时新增一个列。
3、 设计报表模板
3.1 分别根据订购日期的年份、月份分组,将 ds1 中的订购日期拖拽到单元格 A3 中,在自定义分组对话框中设置自定义公式:year($$$)+”年”
, 将 ds1 中的订购日期字段拖拽到 C3 中,同样增加自定义公式分组,分组表达式为 month($$$)+”月”
3.2 D2 单元格按照城市排序,程序里默认按照中文的 ASCII 码排序,如果想按照拼音排序则需要在单元格属性的扩展排序中设置公式,如:
使用该函数需要下载函数插件。类别字段是按 ID 排序,则不需要专门处理。
3.3 交叉点中的销售金额统计,在数据集中先做了处理生成了销售金额字段,此处直接进行求和操作。
3.4 多数据集单元格关联。帆软在做多源关联的时候,通过下拉选择数据列,操作符和比较的对象,通过点击增加按钮,自动生成关联的条件表达式。
3.5 显示值设置
对 C5 中雇员 ID 需要最终显示出雇员的姓名,在形态中要选择数据查询,设置对应的显示值字段。
报表结果
完成后点评
1、 用时,0.5 小时。
2、 数据集设置里直接用向导取数,没有特殊的写法,制作这样的报表对写 SQL 能力要求不高。
3、 到处都有可视化界面,操作体验对初学者非常良好。比如报表中多源关联时,通过下拉选择数据列、操作符和比较的对象,就能自动生成关联的条件表达式,不需要对源数据进行关联处理。
4、 工具采用类 Excel 操作,布局、样式设置按照以前的思维处理就行,包括一些数据汇总等等。
5、 运算模型把字段和表达式分别处理的,需要增加自定义表达式才能拖拽填入,对熟手略显啰嗦。
6、 中文排序默认是按照 ASCII 排序,并不是按照常规的首字母方式,要按首字母排序要用 StringPinyin() 函数转换下,需要单独下载插件,这里有点不方便。
7、 销售金额来源于单价 * 数量,帆软单元格里不能直接先对字段相乘然后再求和,本例中是通过 SQL 语句新增字段,文本数据源或者 nosql 数据库无法执行 SQL 时,只能在报表中增加隐藏行,会比较麻烦。
制作过程
1、 配置并连接数据源。
2、 准备数据集
报表支持多数据集,这里按照需要准备四个,每个数据集分别取自描述中数据结构的四个物理表。
其中订单数据集:“select , 数量单价金额,year(订购日期) 年,month(订购日期) 月 from 订单” ,因为报表内要根据订购日期按 年和月分组,但 smartbi 没有对应的单元格函数支持,所以需要在数据准备阶段把需要分组的字段独立成一个字段。汇总金额也是同样的,在数据集已有字段先算出“金额”。其余数据集取出相应数据就行。
3、 设计报表模板
3.1 订单数据集中已经处理了年、月、金额等,所以报表中直接使用处理后的字段,用鼠标将相应的字段拖拽到对应单元格就行,和其他类 Excel 开发工具类似,此处就不做过细说明了。
3.2 多数据集间关联是通过“过滤”功能,普通条件类型选择数据列,下面的过滤条件就可以直接可以和其他数据集的字段关联了,如下
设计界面
运行结果
完成后点评
1、 用时:1 小时左右。
2、 Smartbi 在 excel 中进行报表开发,比较符合常规使用习惯,主要查看下具体函数使用以及关联操作就行。
3、 关联直接在报表单元格中通过向导方式设置,简单的关联不需要手写代码。
4、 尽管是点选方式设置过滤表达式,不过有些可复用的表达式没法复制粘贴,都必须重复点选一次。
5、 对于年、月分组的处理,没有可用的单元格函数,需要在数据准备阶段,基于“订购日期”字段把年、月单独处理成独立字段。订单金额同样,需要在数据集中设置。如果数据来源是文本文件或者是 NOSQL 数据库,无法写 SQL 语句处理这些字段,这类需求就很难实现了,只能更改数据结构或者报表中增加辅助行列(本例是汇总表,需要增加大量隐藏行列),可行性不大,所以在实际应用中还是有一定限制的。
6、 在设计过程中发现,当有增删行时,其他格子设置的主格不自动变化,这个有点费劲了,一旦有这种情况,都得检查改一遍。
7、 没有真实值和显示值的分类,导致存放在不同库的码表无法把名称给显示出来。 如果必须弄,需要借助“转换规则”,先建转换规则,然后给业务数据集的字段选择规则,然后单元格属性勾选“使用显示值”这个东西是系统配置,也就是需要系统功能配合才能做到 ID 反显名称。
制作过程
1、 配置并连接数据源
2、 设置数据集
永洪中自由格式报表支持多数据源,按照向导方式新增四个数据集,每个数据集对应数据库中的一张表,形成销售员、订单、产品、类别名称四个数据集。永洪报表单元格内支持多数剧集关联的,但使用起来有问题,比如类别表和订单表关联是通过产品 ID,类别和产品 ID 是个一对多的关系,永洪单元格内关联不支持这种 in 的形式,所以没办法用它的多数据集模型来实现这张报表。只能换个思路,在数据集阶段将多个数据集合成一个数据集。本例中实质上是一个事实表和三个维表的关联,还可以改用组合数据集,通过向导将多个数据集结果关联形成一个单数据集:
2.1、 新建组合数据集,将已经创建好的四个数据集通过关联字段关联起来,通过向导方式设置就行。
2.2、 订购日期年、月的处理,在数据集设置中,可以在订购日期上新增加统计字段,用内置函数生成新的字段年和月
2.3、 金额的话同样,可以新增字段,里边写入 单价 * 数量,生成新的计算列
3、 设计报表模板
在数据集设置中,用“组合数据集”将多个数据集关联成了一个数据集,并且对年、月、金额等数据做了处理,所以报表中设计器来就比较方便了,直接用鼠标将字段拖拽到对应的位置,设置扩展方向、合并格等就可以了。
运行结果
完成后点评
1、 报表制作用时,1 小时多。数据集多数据源关联需要较长时间。
2、 数据处理能力较强,提供“组合数据集”将已有的数据集(可跨库)关联成一个新的数据集。能够在数据集基础上新增统计列。
3、 多源关联支持有一定局限性,最好的关联方式应该是报表内单元格间多数据集的关联,这样就不用考虑具体数据集的来源,永洪本身是支持单元格内做格间过滤的,但是关联只能用“=”,而像本例中的类别和产品一对多的关联要用 in 形式,它就不支持了,所以必须要转成单数据集。本例是一个事实表和三个维表的关联,还能转换成单数据集对付,实际应用中数据集个数可能会更多,关联会更复杂、甚至会出现多对多的关联,就做不成单数据集了。而且即使是维表和事实表的简单关联,还需要考虑 left join 等关联方式,设置工作量大增。本例制作时维表中有冗余数据,导致数据不准确,花了较长时间才发现问题,严格上来说并不是一个好方案。总体来看,永洪的多源关联能力还不够完善。
4、 上表头的类别排序实现困难,永洪中单元格不支持显示值属性的设置,要想显示中文单元格内只能从数据集中取中文字段,这样就会按照中文字段排序了,无法达到按照 ID 排序需求,倒是可以加个隐藏行,里边按照 ID 分组排序,然后下边增加一行显示中文,需要增加辅助行,有点费事了。
5、 报表中设置了表头斜线,结果中能显示,但是在设计模板中看不到效果,容易造成混淆。包括单元格多选,不能像 excel 那样鼠标选中一片,要按 ctrl 键,不太方便。
制作过程
1、 配置并连接数据源。
2、 设置数据集
亿信支持多个数据来源,在数据集中增加多个数据集,数据集类型分为主题表和维表,主题表是报表中用到的主数据来源,也就是事实表,比如本例的订单信息,维表用于中文显示值映射,也就是码表。按照向导设置,内容就是普通的 sql 语句,比如(select * from ……)。
亿信报表也支持数据来自多个数据集,但是如果两个数据集要关联取数的话报表单元格内是无法做到的,要提前在数据集设置页面设置表间关系。比如本例中订单表和销售员表是通过雇员 ID 关联,那么要设置一下两个数据集间的表关联关系:
3、报表设计页面
亿信报表的计算和其他报表工具不同,其他报表是先执行数据集取数,然后报表内根据表达式从数据集结果中取数运算,而亿信是分析单元格、解析单元格表达式、查找表间关系、拼 sql 取数返回到单元格,比如产品类别那列,第二行是 CHANPIN 数据集,第三行是 DINGDAN 数据集,
如果数据集创建阶段没有设置表间关系,那么会解析成两个 SQL 去数据库取数,由于报表单元格内无法设置关联,这两段数据是没有任何关联的,本例要求取对应类别下的数据,所以在数据集处创建了 CHANPIN 和 DINGDAN 的关联,这样这块就会解析成类似:select price*num from DINGDAN,CHANPIN where DINGDAN. 产品 ID=CHANPIN. 产品 ID,将这个 SQL 发送到数据库端然后取结果返回,这样就能关联展示,这里可以看到,因为要解析成一个 SQL,所以要求两个数据集来源必须是同一个库。从这个意义讲,亿信并不能算严格支持多源关联报表,关键运算是转换成 SQL 丢给数据库去做的。
亿信的难点在于前期的数据整合、设置表间关联,报表设计的具体操作和其他工具就都比较类似了,比如类别那可以取类别 ID 并按照 ID 排序,在设置显示值,具体这里就不一一说明了。
运行结果
完成后点评
1、 制作用时 1 小时。
2、 多源关联时的处理,要对源数据进行数据的关联处理,数据集多时,找表间关联关系还要验证关联后的数据准确性,耗时较长。
3、 可以通过函数对数据集字段操作,比如年、月维度的控制,销售金额来源于 danjia*shuliang,不需要在数据集中控制。
4、 难点在数据关联处理,数据处理完成后,这个报表格式比较简单,实际报表制作主要通过鼠标拖拽还是比较方便,当然这个好像多个报表工具操作都差不多。
5、 多源关联支持是有问题的,亿信的机制是报表计算时解析单元格内的表达式然后寻找表间关系再拼成 SQL 方式去数据库取数(其实本质还是数据库内的关联),那么就要求多个数据集来自同一个库,这样无法处理异库数据集间的关联,更无法支持非数据库来源的数据。即使是同一数据库,在设置表关联时为保证维数据的不丢失,还要考虑 left join 等情况,实际操作起来还是有些难度的,还要避免出现多对多的情况,否则无法保证数据的正确性,当前机制下处理多源关联类报表难度大。
多源分片报表是非常典型的复杂报表,仅仅从这一个简单例子,也能看出各家产品的风格,而且,这些风格并不只局限于这一个报表,可以说是这些产品的基本特征。
如果不纠结细节的话,各家产品都能完成这个报表,从功能上讲算是都能过关的。
从报表开始起家的润乾和帆软明显要更强,制作过程流畅性要比永洪和亿信这两家以 BI 起家的产品好很多。后两者并不以复杂报表作为主要卖点,但受市场压力,也要提供这种能力,基本上就是做到“可以用”的水平,但远远谈不上好用。Smartbi 介于这两类中间,它以 BI 起家,但年代要久远,受到复杂报表的需求压力也较多,能力比永洪亿信要好很多,但和润乾帆软相比仍有一定的差距。
报表模型上,润乾和帆软基本一样,Smartbi 也类似;永洪和亿信则相差较大。这种单元格扩展来解决分片报表的机制先由润乾发明,帆软之后跟随,扩展模型层面基本上全抄,只是改了术语名称(主格改叫父格),因此是一样的,能力也基本相当。Smartbi 之后再抄过来(延用了帆软的术语,这里面还有故事就不说了),结果形成了相似的模型。而永洪和亿信的 BI 基因较强,对复杂报表的逻辑理解还不够深刻,模型就差了很多,能力当然也会差很多,这两家产品的复杂报表只能算是入门阶段,和其它三家相比不在一个档次。
润乾和帆软的使用都较为流畅,但风格也仍有不同。润乾制作过程中提倡手写表达式,而帆软则更多用可视化界面。看起来后者会对使用者更友好,这也是业界常常说用润乾难帆软易的现象。但对于熟手来讲,手写表达式的效率更高,而且可以随意灵活组合;使用界面编辑对生手门槛低,熟手却会嫌烦,还牺牲灵活性。比如此例中帆软需要先定制数据集把表达式逻辑化成字段才行,而润乾对于表达式和字段是同一套规则,无需专门处理。
从这个意义上,润乾和帆软的扩展模型虽然都一样,但底层运算模型还是有差异。润乾的抽象程度更深,数据计算能力也就更强,初期掌握难度略大,但一旦掌握就会发现能够横扫一切;而帆软考虑的情况要简单,在简单情况下更顺手,但碰到特殊情况时还要再用特殊手段,反而进一步提高学习成本。结果的表现是:初次使用且没碰到复杂情况时帆软的效率更高(选型考察产品时常常是这样的),长期反复使用时(总会碰到复杂情况了)润乾的效率就会明显占优。
报表工具对比选型系列用例——排名及跨行组统计