“报表统计,舍我其谁?!”
前段时间,一直在做报表统计,很有收获。这是我第一次编写报表统计相关的程序,从最初的惶恐,到过程中的点点揪心,到最后完成工作的舒心,一路走来,别有一番滋味在心头。有句话说:“痛快”何以为“快”?全因“痛”字在先。痛过之后的快乐,岂是“欢快”所能比?如是这般,这回,我算是“痛快”了一回。从这篇文章题目你也可看出,我现在该有多“痛快”。是的,我就这样,当我感觉自己在某个方面有那么点收获,我就无法抑制内心的兴奋,变得狂妄,一点也不知道收敛。
“独乐乐,与众乐乐,孰乐?”这份痛快,不敢独享,遂拿出自己做报表统计的一些体会,与大家分享。在这里,我也得感谢qwLiang,没有他的指导参谋,我可能跌倒在了起跑线。感谢dcding和clyin,他们给与了我充分的信任,并给了我足够的时间来思考碰到的问题,没有这么长时间一点一点的“磨”,我不会有这么多的认识和体会,不会思考那么多。
首先说明,我的统计不是利用sql语句实现的,而是在程序中实现的。我要统计的报表都是二维报表,解决方案的大致思路是把二维报表看作是一个矩阵,然后通过遍历查询出来的结果集,对每一条记录分析应该对二维报表的哪一行,哪一列进行累加操作。这样做的好处在于我们不再需要对每个单元格建立一条查询语句,由于得到哪一行,哪一列都是变量表示,使得我们的代码具有很大的伸缩性,我们不用维护那么多条sql语句。好吧,下面我将详细介绍我的问题和解决方案。下面的这个报表是我这次进行报表统计过程中的一个,我作了一些精简,去掉了几行,目的是要清晰的说明问题了。
1 要统计的报表举例:
学生变动统计 单位:人
|
|
编
号 |
上学年初报表在校学生数 |
增 加 学 生 数 |
减 少 学 生 数 |
本学年初报表在校学生数 |
|
计 |
招
生 |
复
学 |
转
入 |
其
他 |
计 |
毕
业 |
结
业 |
休
学 |
退
学 |
死亡 |
转
出 |
其
他 |
|
计 |
非正常 |
|
甲 |
乙 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
|
合 计 |
01 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
其中 |
女 |
02 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
少数民族 |
03 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
说明: 1、“招生”、“在校生”数应与表3-1相关数据对应相等。 2、本表列关系为(16)=(1)+(2)-(7);(2)=(3)+…+(6);(7)=(8)+(9)+(10)+(11)+(12)+(14)+(15)。
2 解决方案
具体的展现形式先不用管,我们要有这样一个观念,统计是负责把数据库中的满足我们条件的数据查找出来,然后进行累加,报表展示是页面的展示形式,这两者是可以分离开来的。故此,我们可以把它根据关系数据库规范化理论第一范式,把这个报表“规范化”,变成一个矩阵。具体来说就是下面这样一个形式:
|
|
编
号 |
上学年初报表在校学生数 |
增加总计
|
招生 |
复学 |
转入 |
其他 |
减少总计 |
毕
业 |
结
业 |
休
学 |
退
学 |
死亡总计 |
非正常死亡 |
转出 |
其他 |
本学年初报表在校学生数 |
|
甲 |
乙 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
|
合 计 |
01 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
女 |
02 |
|
|
|
|