以有限搏无限:答liwei81730之突破层次报表汇总的局限

来源:互联网 发布:笨办法学python最新版 编辑:程序博客网 时间:2024/04/28 20:46

本文的题目来自于:http://topic.csdn.net/u/20090429/15/63788b6b-5afc-448f-a6e1-add909c083e5.html

Title

使用水晶报表的层次分组,将数据集分为若干组,且每组有若干层次。
例如:统计各个省的粮食与水果产量
地名      粮食产量(吨)  水果产量(吨)
江苏省      5              6
南京市      2              2
徐州市      1              2
……
如上所示:假设江苏省本身产粮食2吨,但南京与徐州均属于江苏,所以在报表中显示江苏省粮食产量为2+2=1=5吨
我们假设5吨为变量NUM1,同理水果产量6吨,假设变量NUM2
我的问题:如何求NUN1/NUM2的比率?

 

另外的信息

 

Title

表结构比较简单,简化一下就像下面所示:
ID(分组依据),PARENT_ID(当前ID的父层ID,用于建立层次分组依据),粮食产量(当前ID的粮食产量)

类似于在SQL中求比率的做法,我已经实现,但是效率不高,主要是用SQL涉及到存储过程中用引用若干方法,且有递归。
所以如果用水晶报表自带方法会快一些,请问斑竹有何高见?

 

liwei81730使用了层级分组来实现多层级的基础汇总,
但是用了层级组后,无法取得num1和num2,因为水晶报表中无法取得层级组的汇总。
那么怎么来解决这个问题呢?

本文是建立在此命题的基础上,但是有一定限制,但是我个人认为这是个尚可接受的方案。
核心是更改数据结构
这个听起来似乎不可接受,需要为了报表来更改表结构吗?有时候是需要的,这个要综合考虑代价。
而对于本例,我觉得是合适的。为了报表
而为什么我又说到“以有限搏无限”呢?这也是局限于本例。
考虑到地区的特性,这个基础表的层次不会太深。
一般为:省、市、区(县)、镇、村、组(队),但是一般来说,我们只会统计到3个层次的深度。
本例也以三个深度为限,可能是4个或5个,但是不会是无限的。所以我们有时候,不需要写一个无限的递归去做。
于是我们以一个有限的三层数据区实现一个基本的原来看似是无限的数据基础。

liwei81730发给我了一个样例,我想如果我们只去遵循这个样例,而不考虑我们项目的实际情况,可能会走很多弯路。
当然,这里,我可能也是把场景想简单了。

好像说了很多,不知道有没有人会去看。下面我就开始切入正题:

1:首先我根据需求构造了一组数据,绿色部分和箭头显示了数据汇总流向

而为了实现我的要求,我加了一个列,pathstr,路径字串。
如果是一级公司,路径为本公司代码
如果是二级公司,路径为 上级公司代码/本级公司代码
如果是三级公司,路径为 一级公司代码/二级公司代码/三级公司代码

基础代码表的表更新频率很低,我觉得可以写一个脚本来手工去更新下这个字段
这只是一个性操作,基本不影响其他环节。

2:构建一个基础报表,很简单,就是一个纯列表

 

3:创建第一个组,把一级公司的数据先分出来。

创建一个公式path1

以此公式作为分组字段

效果如下,我们完成第一个目标,把第一级区分开来了。

4:建立第二个公式path2,注意公式里的注释部分

将path2作为第二个分组字段,出来的效果如下

好了,数据的形状基本出来了。

5:现在,我们在组页眉上加上汇总字段

看一下数据,是不是就是我们想要的呢?

继续美化一下,

把详细资料节的“Name”字段拷贝到两个组页眉上去,看效果。
如果把灰色标记的这些部分拿掉,是不是就是我们想要的效果呢?

6:我们首先控制详细资料节,节专家中

再控制组2的组页眉

 

汇总的效果就出来了。

7:最后,我们来实现Num2/Num1的比率,这个就很简单了,以一级公司为例,做个公式rate1

效果如下,依次类推。注意保护分母为0的情况。
            

8:如果是4个层级,只要多一个公式分组,多一级隐藏显示就行了。以此类推。

小结:

1:特别说明的是,此处的pathstr是改基础代码表,而不是数据表
2:对于一些非常规报表,就要用一些非常规手法。
但要综合考虑代价,时间成本以及对系统的整体影响。
比如你的表是月度表,而不是即席报表,
那么用你自己的SQL定时生成一个结果集,在前台以一个普通的分组报表展示效果也很好。