Maison > Article > base de données > 佩特来项目经验小集合(3)___从多表统计金额汇总到一张表
来这个项目主要是佩特来公司各部门及各代理商使用的系统,这个系统其中的一下功能就是统计代理商费用。费用的统计放在了费用池(传统方式统计代理商费用就叫费用池)数据表中,代理商可以根据费用池的中的金额购买东西,费用池中的钱来自于代理商每次填写的
来这个项目主要是佩特来公司各部门及各代理商使用的系统,这个系统其中的一下功能就是统计代理商费用。费用的统计放在了费用池(传统方式统计代理商费用就叫费用池)数据表中,代理商可以根据费用池的中的金额购买东西,费用池中的钱来自于代理商每次填写的维修鉴定单中。
下面看一下这部分的数据表结构:
下面的存储过程是汇总材料费及其他费用表的费用并汇总到费用池信息表的存储过程,这段代码有点长,加入了各种判断:
-- ============================================= -- Author: 马兆娟 -- Create date: 2014-7-20 15:32:16 -- Description: 统计材费及其他费用汇总到费用池 -- ============================================= CREATE PROCEDURE [dbo].[PROC_WXJD_CommitFee] -- Add the parameters for the stored procedure here @wxjdId int, --维修鉴定单ID @dlsId int --代理商ID AS DECLARE @Err1 int, --声明变量,事务使用 @Err2 int, --声明变量,事务使用 @glf decimal, --管理费 @gsf decimal, --工时费 @xj decimal, --小计 @totalMoney decimal, --总金额 @count int, --整型数据 @LJGLF decimal, --零件管理费 @LJGSF decimal, --零件工时费 @QTFY decimal, --其他费用 @WXJDTotalMoney decimal --总金额 BEGIN BEGIN TRANSACTION --开启事务 SELECT @count=0; --给变量赋值 --下面统计其他费用 SELECT @count=count(*) FROM T_DLS_WXJD_Cost_QTFY WHERE FID=@wxjdId IF @count>0 --判断其他费用表是否已写入其他费用值,下面给小计赋值 BEGIN SELECT @xj = CASE SUM(xj) WHEN null THEN 0 ELSE Sum(xj) END FROM T_DLS_WXJD_Cost_QTFY WHERE FID=@wxjdId; END ELSE BEGIN SELECT @xj=0; END --下面是统计材料费 SELECT @count=0; SELECT @count=count(*) FROM T_DLS_WXJD_Cost_CLF WHERE Fid =@wxjdId IF @count>0 --判断材料费表是否已写入材料费,下面给管理费、工时费赋值 BEGIN SELECT @glf = CASE SUM(GLF) WHEN null then 0 ELSE SUM(GLF) END ,@gsf = CASE SUM(gsf) WHEN null THEN 0 ELSE Sum(gsf) END FROM T_DLS_WXJD_Cost_CLF WHERE Fid =@wxjdId END ELSE BEGIN SELECT @glf=0; SELECT @gsf=0; END --下面给总金额赋值 SELECT @totalMoney = @xj + @glf + @gsf; --print @totalMoney; --下面将从其他费用及材料费中统计的金额写入费用池 SELECT @count =0; SELECT @count=COUNT(*) FROM T_FeeExist WHERE DLSID = @dlsId; IF @count>0 --判断费用池表是否已写入某代理商费用,如果已写入过代理商费用,则需向代理商各项费用上添加统计的费用 BEGIN SELECT @LJGLF=LJGLF,@LJGSF=LJGSF,@QTFY=QTFY,@WXJDTotalMoney=WXJDTotalMoney FROM T_FeeExist WHERE DLSID = @dlsId; SELECT @LJGLF=@LJGLF+@glf; SELECT @LJGSF=@LJGSF+@gsf; SELECT @QTFY=@QTFY+@xj; SELECT @WXJDTotalMoney=@WXJDTotalMoney+@totalMoney; UPDATE T_FeeExist SET LJGLF=@LJGLF,LJGSF=@LJGSF,QTFY=@QTFY,WXJDTotalMoney=@WXJDTotalMoney WHERE DLSID = @dlsId; END ELSE --第一次向费用池写入某代理商费用,添加新记录 BEGIN INSERT INTO T_FeeExist(DLSID,LJGLF,LJGSF,QTFY,WXJDTotalMoney) values(@dlsId,@glf,@gsf,@xj,@totalMoney); END SET @err1=@@ERROR --更新维修鉴定表是否已提交到费用池字段 UPDATE T_DLS_WXJD SET IsFYC='是' WHERE ID=@wxjdId SET @err2=@@ERROR --判断是否出错 IF (@Err1=0 and @Err2=0 ) COMMIT TRANSACTION --提交事务 ELSE ROLLBACK TRANSACTION --事务回滚 END
统计费用就简单的介绍到这里了,这里主要记录的关键点就是如何汇总各表的数据及存储过程中对数值进行判断!