现在的位置: 首页 > 综合 > 正文

对DB操作的一点认识——所有数据计算在SQL中进行

2013年12月06日 ⁄ 综合 ⁄ 共 1484字 ⁄ 字号 评论关闭

在某些系统的应用时,会要求输出一些账票,而对于这些账票的内容和格式的处理,则是一个很繁锁的工作,最近的一个项目就是账票的输出,所用的方法如下:

 

        从DB中取出,为了处理的方便,所以在用SQL取出数据时,尽量取出要求输出的所有数据,而不是只取出要输出的数据中的一部分,然后再在输出时,利用这一部分数据来进行计算。

        例如,在大多数票据中,都要求有一合计栏,此时就可以把这一合计添加到每一条数据之后,然后在输出时按照账票的格式要求输出。   
而不是仅仅只检索出单条数据,然后在输出时进行计算求合计。   
   
        现假设有如下要求:以每个STORE为单位,输出每个STORE的销售情况,并求出合计。(SQL 2000中pubs数据库为例)   
数据库有如下数据:

 

        select * from sales order by stor_id asc

 

data in table sales

 

 

        而在实际情况是,可能要统计每家店的每笔销售情况及销售总额,当然,很容易就可以想到一种处理方法,就是把每条数据从DB中取出来,然后再制做票据时,来计算每家店的销售之和,这样处理顾然简单,且容易想到,但是对于显示数据的处理,就要很复杂(这点在写实际处理数据显示时深有体会),现在既然发现了这种方法的短处,那么就要想办法避免其短处,于是就很自然的想到,能不能在从BD中取出数据时,就把每家店铺的销售之和计算出来,那么我们来试试。

 

现在按上面的想法,写出如下的SQL文

       select * from sales left outer join
            (select stor_id, sum(qty) sum_qty from sales group by stor_id) temp_tbl    on
                  sales.stor_id = temp_tbl.stor_id   
       order by sales.stor_id desc  

 

  sum of sales

 

这样,把每家店的各笔销售之和做为该店的一个属性,并把其值求出来,于是,在处理销售之和时,只需要取出该店铺任一笔销售的记录中的[sum_qty]属性之值即可。

 

         特别是要求把每家店铺的销售情况单独做成票据,并要求打印出来时,这时,就可以循环遍历这个DataSet,当stor_id变更时,在紧接的一行中输出销售额之和,并换页。(当然,换页的情况比较复杂,比如某家店铺有很多笔[N]生意,而一张票据可能容不下这些数据,也就是说这些店铺的销售情况,走超过一张票据所能容下的最大量[M],这时就要考虑换页,换页时,还要分析N-M的数值,根据要求换页时是否需要重新写票据头,以及N-M之值为0[即一张或几张票据刚好容下所有的记录,但是显示总额这一人为添加的记录,却要求在另一张票据上显示,这个是必需要考虑的],等等,以后总结好后,再写BLOG来记录)。

 

        通过SQL文来处理数据计算,而不是在显示数据时再去处理这些计算,这是最近在工作中一个很深的体会。另外,前段时间中午吃饭时,和一个项目经理闲聊,从他口中也得到一个有关DB处理的经验,就是项目中所有的SQL文,应尽量写在procedure或function中,在数据库连接的这一层中,只需要调用这些procedure或function,在具体用某种语言写的代码中,只需要处理逻辑即可,当数据的处理要求或访求改变时,只需要更写SQL文,这样做与在代码中嵌SQL文相比,有一个很显著的好处,就是更改后,不用重新编译SOURCE,会省很多事的,我按这种方法试验过。

抱歉!评论已关闭.