sql利用视图实现一个数值型字段的求和问题
2009-06-28 10:49
417 查看
有如下简单需求:客户购买产品,厂商想看到收入和欠费统计。
已存在的数据库主要表结构:客户表(Customer)和销售记录表(SoldRecord),另外相关表(如产品表Product)在此略过。
1、客户表
这个表很简单:
字段说明:
tid int 自增字段 关键字
name 客户名
adddate 添加日期
address 客户所在地2、销售记录表
字段说明:
tid int 自增字段 关键字
customerid 客户tid
boughtdate 客户购买产品日期
paidmoney 金额(正数代表已付款,负数代表欠费)客户需求分析:“厂商想看到收入和欠费统计”,分析上述表结构,可以看到问题的由来就出在这个表的paidmoney字段上。收入必须将paidmoney按照正数相加,欠费则必须按负数相加。这样我们就想到将paidmoney字段“拆一为二”,便于sql函数的统计计算。
3、视图创建(viewRecordDetail)
SELECT dbo.Customer.tid, dbo.Customer.name, dbo.Customer.addDate, dbo.Customer.address, dbo.SoldRecord.boughtDate, dbo.SoldRecord.tid AS sid,
ABS(CASE WHEN dbo.SoldRecord.paidMoney > 0 THEN dbo.SoldRecord.paidMoney ELSE 0 END) AS income,
ABS(CASE WHEN dbo.SoldRecord.paidMoney < 0 THEN dbo.SoldRecord.paidMoney ELSE 0 END) AS outcome, dbo.SoldRecord.paidMoney
FROM dbo.Customer INNER JOIN
dbo.SoldRecord ON dbo.Customer.tid = dbo.SoldRecord.CustomerId
GROUP BY dbo.Customer.tid, dbo.SoldRecord.tid, dbo.Customer.name, dbo.Customer.addDate, dbo.Customer.address, dbo.SoldRecord.boughtDate,
dbo.SoldRecord.paidMoney很明显,两个表的连接查询创建一个视图,重点是利用case when将paidmoney的拆分。其中income为收入,outcome为欠费,函数ABS取绝对值(我们当然可以利用其他函数如sum取值)。这样需要统计的话,直接对视图进行操作就可以了。
4、简单示例
下面向两个表里填充一些数据,测试一下。
(1)、客户表
use testdb
insert into customer select 'jeff wong',getdate(),'beijing'
union all select 'jeffery zhao',getdate(),'shanghai'
union all select 'dudu',getdate(),'shanghai'
union all select 'terrylee',getdate(),'tianjin'(2)、销售记录表
use testdb
insert into soldRecord select 1,getdate(),168
union all select 2 ,getdate(),223
union all select 1,getdate(),-7500
union all select 1,getdate(),268
union all select 4 ,getdate(),-113
union all select 3,getdate(),500
union all select 1,getdate(),22
union all select 4 ,getdate(),15
union all select 3,getdate(),-15000
union all select 1,getdate(),200
union all select 2 ,getdate(),111
union all select 2,getdate(),7000
union all select 2,getdate(),268(3)、统计
select sum(income) as totalIncome,
sum(outcome) as totalOutcome from viewRecordDetail
小结:这里只是记录一下个人解决问题的思路和简单实践,并不推荐直接利用sql的dbms做这些琐碎的统计处理。sql固然强大,但是,汝之蜜糖,焉知不是我之毒药呢?其实强大的高级语言如c#,java等都可以轻松实现这些功能,更何况创建太多视图什么的不易维护。还是千方百计地创建合理的表结构,交给高级语言处理去吧。
已存在的数据库主要表结构:客户表(Customer)和销售记录表(SoldRecord),另外相关表(如产品表Product)在此略过。
1、客户表
这个表很简单:
字段说明:
tid int 自增字段 关键字
name 客户名
adddate 添加日期
address 客户所在地2、销售记录表
字段说明:
tid int 自增字段 关键字
customerid 客户tid
boughtdate 客户购买产品日期
paidmoney 金额(正数代表已付款,负数代表欠费)客户需求分析:“厂商想看到收入和欠费统计”,分析上述表结构,可以看到问题的由来就出在这个表的paidmoney字段上。收入必须将paidmoney按照正数相加,欠费则必须按负数相加。这样我们就想到将paidmoney字段“拆一为二”,便于sql函数的统计计算。
3、视图创建(viewRecordDetail)
SELECT dbo.Customer.tid, dbo.Customer.name, dbo.Customer.addDate, dbo.Customer.address, dbo.SoldRecord.boughtDate, dbo.SoldRecord.tid AS sid,
ABS(CASE WHEN dbo.SoldRecord.paidMoney > 0 THEN dbo.SoldRecord.paidMoney ELSE 0 END) AS income,
ABS(CASE WHEN dbo.SoldRecord.paidMoney < 0 THEN dbo.SoldRecord.paidMoney ELSE 0 END) AS outcome, dbo.SoldRecord.paidMoney
FROM dbo.Customer INNER JOIN
dbo.SoldRecord ON dbo.Customer.tid = dbo.SoldRecord.CustomerId
GROUP BY dbo.Customer.tid, dbo.SoldRecord.tid, dbo.Customer.name, dbo.Customer.addDate, dbo.Customer.address, dbo.SoldRecord.boughtDate,
dbo.SoldRecord.paidMoney很明显,两个表的连接查询创建一个视图,重点是利用case when将paidmoney的拆分。其中income为收入,outcome为欠费,函数ABS取绝对值(我们当然可以利用其他函数如sum取值)。这样需要统计的话,直接对视图进行操作就可以了。
4、简单示例
下面向两个表里填充一些数据,测试一下。
(1)、客户表
use testdb
insert into customer select 'jeff wong',getdate(),'beijing'
union all select 'jeffery zhao',getdate(),'shanghai'
union all select 'dudu',getdate(),'shanghai'
union all select 'terrylee',getdate(),'tianjin'(2)、销售记录表
use testdb
insert into soldRecord select 1,getdate(),168
union all select 2 ,getdate(),223
union all select 1,getdate(),-7500
union all select 1,getdate(),268
union all select 4 ,getdate(),-113
union all select 3,getdate(),500
union all select 1,getdate(),22
union all select 4 ,getdate(),15
union all select 3,getdate(),-15000
union all select 1,getdate(),200
union all select 2 ,getdate(),111
union all select 2,getdate(),7000
union all select 2,getdate(),268(3)、统计
select sum(income) as totalIncome,
sum(outcome) as totalOutcome from viewRecordDetail
小结:这里只是记录一下个人解决问题的思路和简单实践,并不推荐直接利用sql的dbms做这些琐碎的统计处理。sql固然强大,但是,汝之蜜糖,焉知不是我之毒药呢?其实强大的高级语言如c#,java等都可以轻松实现这些功能,更何况创建太多视图什么的不易维护。还是千方百计地创建合理的表结构,交给高级语言处理去吧。
相关文章推荐
- 问题:利用输入输出流重载实现一个整数数组的输入和输出。 要求:输入一个数组大小 及 所有元素的值,排序后输出该数组的所有元素。
- 安卓中利用TranslateAnimation实现图片循环移动时候的出现的一个问题,在这里记一下
- 利用UIBezierPath实现一个带圆角的视图
- 解决Mysql数据库实现多表联合查询及按照其中一个字段进行排序问题
- 68 sql 查找表中同一个字段出现的重复项次数 视图
- 循环SQL语句实现,将一个数字字段的商数拆分成多条记录
- 要求顺序循环队不损失一个空间,全部能够得到有效利用,试采用设置标志位tag的方法解决“假溢出”问题,实现顺序循环队列算法
- DataTable实现列位置交换,用于SQL语句无法解决字段页面显示顺序问题
- 利用UIBezierPath实现一个带圆角的视图
- 利用SQL未公开的存储过程实现分页(更加好用的一个!)
- 给定一个一oracle建表的sql语句,解析读出的字符串,将表名、字段名、字段类型数据取出,怎么实现啊?
- 一个利用sql 语句来实现分页的存储过程
- 一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数,用SQL语句及视图、存储过程分别实现。
- sql语句问题 通过联立两个表更新其中一个表的字段
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行
- 关于统计的一个sql问题,使用动态sql语句实现。
- 利用SVM实现一个三类分类问题
- SQL7.0有如下问题:视图字段未及时刷新
- 利用UIBezierPath实现一个带圆角的视图