对DB操作的一点认识------所有数据计算在SQL中进行
2009-09-18 20:36
477 查看
在某些系统的应用时,会要求输出一些账票,而对于这些账票的内容和格式的处理,则是一个很繁锁的工作,最近的一个项目就是账票的输出,所用的方法如下:
从DB中取出,为了处理的方便,所以在用SQL取出数据时,尽量取出要求输出的所有数据,而不是只取出要输出的数据中的一部分,然后再在输出时,利用这一部分数据来进行计算。
例如,在大多数票据中,都要求有一合计栏,此时就可以把这一合计添加到每一条数据之后,然后在输出时按照账票的格式要求输出。
而不是仅仅只检索出单条数据,然后在输出时进行计算求合计。
现假设有如下要求:以每个STORE为单位,输出每个STORE的销售情况,并求出合计。(SQL 2000中pubs数据库为例)
数据库有如下数据:
select * from sales order by stor_id asc
而在实际情况是,可能要统计每家店的每笔销售情况及销售总额,当然,很容易就可以想到一种处理方法,就是把每条数据从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_qty]属性之值即可。
特别是要求把每家店铺的销售情况单独做成票据,并要求打印出来时,这时,就可以循环遍历这个DataSet,当stor_id变更时,在紧接的一行中输出销售额之和,并换页。(当然,换页的情况比较复杂,比如某家店铺有很多笔
生意,而一张票据可能容不下这些数据,也就是说这些店铺的销售情况,走超过一张票据所能容下的最大量[M],这时就要考虑换页,换页时,还要分析N-M的数值,根据要求换页时是否需要重新写票据头,以及N-M之值为0[即一张或几张票据刚好容下所有的记录,但是显示总额这一人为添加的记录,却要求在另一张票据上显示,这个是必需要考虑的],等等,以后总结好后,再写BLOG来记录)。
通过SQL文来处理数据计算,而不是在显示数据时再去处理这些计算,这是最近在工作中一个很深的体会。另外,前段时间中午吃饭时,和一个项目经理闲聊,从他口中也得到一个有关DB处理的经验,就是项目中所有的SQL文,应尽量写在procedure或function中,在数据库连接的这一层中,只需要调用这些procedure或function,在具体用某种语言写的代码中,只需要处理逻辑即可,当数据的处理要求或访求改变时,只需要更写SQL文,这样做与在代码中嵌SQL文相比,有一个很显著的好处,就是更改后,不用重新编译SOURCE,会省很多事的,我按这种方法试验过。
从DB中取出,为了处理的方便,所以在用SQL取出数据时,尽量取出要求输出的所有数据,而不是只取出要输出的数据中的一部分,然后再在输出时,利用这一部分数据来进行计算。
例如,在大多数票据中,都要求有一合计栏,此时就可以把这一合计添加到每一条数据之后,然后在输出时按照账票的格式要求输出。
而不是仅仅只检索出单条数据,然后在输出时进行计算求合计。
现假设有如下要求:以每个STORE为单位,输出每个STORE的销售情况,并求出合计。(SQL 2000中pubs数据库为例)
数据库有如下数据:
select * from sales order by stor_id asc
而在实际情况是,可能要统计每家店的每笔销售情况及销售总额,当然,很容易就可以想到一种处理方法,就是把每条数据从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_qty]属性之值即可。
特别是要求把每家店铺的销售情况单独做成票据,并要求打印出来时,这时,就可以循环遍历这个DataSet,当stor_id变更时,在紧接的一行中输出销售额之和,并换页。(当然,换页的情况比较复杂,比如某家店铺有很多笔
生意,而一张票据可能容不下这些数据,也就是说这些店铺的销售情况,走超过一张票据所能容下的最大量[M],这时就要考虑换页,换页时,还要分析N-M的数值,根据要求换页时是否需要重新写票据头,以及N-M之值为0[即一张或几张票据刚好容下所有的记录,但是显示总额这一人为添加的记录,却要求在另一张票据上显示,这个是必需要考虑的],等等,以后总结好后,再写BLOG来记录)。
通过SQL文来处理数据计算,而不是在显示数据时再去处理这些计算,这是最近在工作中一个很深的体会。另外,前段时间中午吃饭时,和一个项目经理闲聊,从他口中也得到一个有关DB处理的经验,就是项目中所有的SQL文,应尽量写在procedure或function中,在数据库连接的这一层中,只需要调用这些procedure或function,在具体用某种语言写的代码中,只需要处理逻辑即可,当数据的处理要求或访求改变时,只需要更写SQL文,这样做与在代码中嵌SQL文相比,有一个很显著的好处,就是更改后,不用重新编译SOURCE,会省很多事的,我按这种方法试验过。
相关文章推荐
- 将数据库常用的操作(连接数据库,获得所有数据,获得一条记录,获得一列记录,获得一条索引数组,获得一条关联数组)都给封装到db.class.php里面,谁需要谁继承这个类 注意:提交封装的类文件
- SQL使用游标遍历多层table获取每行的数据进行操作
- 操作DB~~对数据的增删改查!!sql语句
- 操作DB ~~对数据的增删改查!!sql语句 (二)
- 对SQL数据表和数据库进行迭代操作
- 使用SQL游标对数据进行遍历循环操作
- sql 脚本-- 变量所有表进行操作
- 怎样对SQL 数据表和数据库进行迭代操作
- SQL操作数据库,创建数据库,查看所有的数据库,对数据库进行增删改,查看当前使用的数据库
- sql循环取出数据进行操作
- 使用Repeater绑定数据,及提取显示数据进行操作的一点小方法!(模板列)
- 在verilog中使用clogb2函数可进行log2操作,用来计算数据位宽
- sqlite-SQL-对表中的数据记录进行增删改查操作
- [导入]Silverlight 2 (beta1)数据操作(5)——使用LINQ to SQL进行数据CRUD操作(上)
- SQL如何进行增加、删除、改写、查询等数据操作
- 对表数据进行(置顶,上移,下移,置底操作)---数据库sql
- Silverlight 2 (beta1)数据操作(6)——使用LINQ to SQL进行数据CRUD操作(下)
- SQL 游标使用的小例子,对于每行数据根据参数的不同进行Insert或Update操作.
- 不需要sql进行计算数据的平均值、最大值、最小值、和
- Sql 语句实现在同一个DB中复制表和空清一个DataTable中的所有数据