Linux中国论坛's Archiver

viving 发表于 2005-12-9 10:29

多源分片报表的讨论

实际业务中有许多报表处理起来会比较麻烦,比如下例:
<br><img src="http://www.report99.com/images/image002%5B1%5D.jpg" border="0" onclick="javascript:window.open(this.src);" alt="" style="CURSOR: pointer" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" />
<br>这是一张银行业务的实际报表经过适当简化以后形成的,我们有一个制表的实际数据可以看一下。报表统计的是银行各支行抵押贷款情况,按照不同分类方式对不同抵押物的总价值进行统计。
<br>
<br>数据库的数据表为,客户有一张单独的编码,名称对照的字典表,另有汽车,房产,土地,其他四项分开的四张表。每张表均通过客户编码字段与客户表建立关系。
<br>
<br>用大多数的传统报表工具,都只支持单一数据源。这时标准的做法是这张表需要写如下的SQL语句准备数据::
<br>
<br>select 客户表.客户编码,汽车.抵押金额, 房产.抵押金额, 土地.抵押金额,其他.低价金额 from 汽车,房产,土地,其他
<br>
<br>where (客户表.客户编码 in (select 汽车.客户编码 from 汽车) or客户表.客户编码 in (select f房产.客户编码 from 房产) or客户表.客户编码 in (select 土地.客户编码 from 土地) or客户表.客户编码 in (select 其他.客户编码 from 其他)) and汽车.客户编码=客户表.客户编码 and?房屋.客户编码=客户表.客户编码 and?土地.客户编码=客户表.客户编码 and?其他.客户编码=客户表.客户编码
<br>
<br>这个只是最简单的一种情况,实际情况中,一个客户往往是多次抵贷,那么我们还需要对客户名称进行分组,将客户多次抵押的数量合计起来。那个SQL的复杂程度又增加了。
<br>
<br>select 客户表.客户编码,sum(汽车.抵押金额), sum(房产.抵押金额), sum(土地.抵押金额),sum(其他.低价金额 ) from 汽车,房产,土地,其他 group by汽车.客户编码,房产客户编码.土地.客户编码,其他.客户编码 where (客户表.客户编码 in (select 汽车.客户编码 from 汽车) or客户表.客户编码 in (select f房产.客户编码 from 房产) or客户表.客户编码 in (select 土地.客户编码 from 土地) or客户表.客户编码 in (select 其他.客户编码 from 其他)) and汽车.客户编码=客户表.客户编码 and?房屋.客户编码=客户表.客户编码 and?土地.客户编码=客户表.客户编码 and?其他.客户编码=客户表.客户编码
<br>
<br>在加上选择当前支行的情况。SQL将更加复杂,我们就简略了。在实际报表中,上面我们看到的报表还只是这个报表的左半部分。全表如下:
<br>
<br><img src="http://www.report99.com/images/image004%5B1%5D.jpg" border="0" onclick="javascript:window.open(this.src);" alt="" style="CURSOR: pointer" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" />
<br>
<br>即再对每个表中的某个抵押物情况的字段进行统计,where条件增加了一倍。
<br>
<br>相信很少人能够一次写出完成SQL语句来完成这张报表。
<br>
<br>而如果报表工具能够支持多数据源,则情况会变得简单得多。支持多源有两个含义,一是要能同时从多个数据源获得数源,二是能够同时使用多个数据库源的数据。
<br>
<br>在采用多数据库源的典型产品润干报表,象上述的复杂的报表,实现起来就非常简单。只用写几句简单的SQL:
<br>
<br>1. select DISTINCT汽车.客户编码,房屋.客户编码,土地.客户编码,其他.客户编码from 汽车,房屋,土地,其他
<br>
<br>2. select 其他.客户编码 from 其他
<br>
<br>3.select 客户表.客户编码 from 客户表 where 客户表.开户支行= 参数支行
<br>
<br>4.select sum(汽车.抵押金额) from 汽车 group by 汽车.客户编码
<br>
<br>5. select sum(房屋.抵押金额) from 房屋 group by 房屋.客户编码
<br>
<br>6. select sum(土地.抵押金额) from 土地 group by 土地.客户编码
<br>
<br>7. select sum(其他.抵押金额) from 汽车 group by 其他.客户编码
<br>
<br>只需要这么几条简单的SQL在润干报表EXCEL式的格子中再作简单的关联就可以了,相信这样简单的SQL稍微知道点业务,会一般的SQL的人就能够写出来。
<br>
<br>而接着完成右边的部分。我们只要参照3-7SQL语句的写法改成计算所有的金额按不同类型分布即可。
<br>
<br>在润干报表工具的格子中,直接写入公式,如:
<br>
<br><img src="http://www.report99.com/images/image006%5B1%5D.jpg" border="0" onclick="javascript:window.open(this.src);" alt="" style="CURSOR: pointer" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" />
<br>
<br>我们可以看到,所有的多级关联在报表设计时,变成了多个二级关联,简化了SQL的实现,同时在运算效率上得到了很大的提高。
<br>
<br>转自:<a href="http://www.report99.com" target="_blank">report99</a>   原文网址:<a href="http://www.report99.com/zhuati/zht_sj_3.htm" target="_blank">多源分片报表的讨论</a>

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.