当前位置:Gxlcms > mysql > 佩特来项目经验小集合(3)___从多表统计金额汇总到一张表

佩特来项目经验小集合(3)___从多表统计金额汇总到一张表

时间:2021-07-01 10:21:17 帮助过:34人阅读

来这个项目主要是佩特来公司各部门及各代理商使用的系统,这个系统其中的一下功能就是统计代理商费用。费用的统计放在了费用池(传统方式统计代理商费用就叫费用池)数据表中,代理商可以根据费用池的中的金额购买东西,费用池中的钱来自于代理商每次填写的

来这个项目主要是佩特来公司各部门及各代理商使用的系统,这个系统其中的一下功能就是统计代理商费用。费用的统计放在了费用池(传统方式统计代理商费用就叫费用池)数据表中,代理商可以根据费用池的中的金额购买东西,费用池中的钱来自于代理商每次填写的维修鉴定单中。

下面看一下这部分的数据表结构:

\

下面的存储过程是汇总材料费及其他费用表的费用并汇总到费用池信息表的存储过程,这段代码有点长,加入了各种判断:

  1. -- =============================================
  2. -- Author:
  3. 马兆娟
  4. -- Create date: 2014-7-20 15:32:16
  5. -- Description:
  6. 统计材费及其他费用汇总到费用池
  7. -- =============================================
  8. CREATE PROCEDURE [dbo].[PROC_WXJD_CommitFee]
  9. -- Add the parameters for the stored procedure here
  10. @wxjdId int, --维修鉴定单ID
  11. @dlsId int --代理商ID
  12. AS
  13. DECLARE
  14. @Err1 int, --声明变量,事务使用
  15. @Err2 int, --声明变量,事务使用
  16. @glf decimal, --管理费
  17. @gsf decimal, --工时费
  18. @xj decimal, --小计
  19. @totalMoney decimal, --总金额
  20. @count int, --整型数据
  21. @LJGLF decimal, --零件管理费
  22. @LJGSF decimal, --零件工时费
  23. @QTFY decimal, --其他费用
  24. @WXJDTotalMoney decimal --总金额
  25. BEGIN
  26. BEGIN TRANSACTION --开启事务
  27. SELECT @count=0; --给变量赋值
  28. --下面统计其他费用
  29. SELECT @count=count(*) FROM T_DLS_WXJD_Cost_QTFY WHERE FID=@wxjdId
  30. IF @count>0 --判断其他费用表是否已写入其他费用值,下面给小计赋值
  31. BEGIN
  32. SELECT @xj = CASE SUM(xj) WHEN null THEN 0 ELSE Sum(xj) END FROM T_DLS_WXJD_Cost_QTFY WHERE FID=@wxjdId;
  33. END
  34. ELSE
  35. BEGIN
  36. SELECT @xj=0;
  37. END
  38. --下面是统计材料费
  39. SELECT @count=0;
  40. SELECT @count=count(*) FROM T_DLS_WXJD_Cost_CLF WHERE Fid =@wxjdId
  41. IF @count>0 --判断材料费表是否已写入材料费,下面给管理费、工时费赋值
  42. BEGIN
  43. 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
  44. FROM T_DLS_WXJD_Cost_CLF WHERE Fid =@wxjdId
  45. END
  46. ELSE
  47. BEGIN
  48. SELECT @glf=0;
  49. SELECT @gsf=0;
  50. END
  51. --下面给总金额赋值
  52. SELECT @totalMoney = @xj + @glf + @gsf;
  53. --print @totalMoney;
  54. --下面将从其他费用及材料费中统计的金额写入费用池
  55. SELECT @count =0;
  56. SELECT @count=COUNT(*) FROM T_FeeExist WHERE DLSID = @dlsId;
  57. IF @count>0 --判断费用池表是否已写入某代理商费用,如果已写入过代理商费用,则需向代理商各项费用上添加统计的费用
  58. BEGIN
  59. SELECT @LJGLF=LJGLF,@LJGSF=LJGSF,@QTFY=QTFY,@WXJDTotalMoney=WXJDTotalMoney FROM T_FeeExist WHERE DLSID = @dlsId;
  60. SELECT @LJGLF=@LJGLF+@glf;
  61. SELECT @LJGSF=@LJGSF+@gsf;
  62. SELECT @QTFY=@QTFY+@xj;
  63. SELECT @WXJDTotalMoney=@WXJDTotalMoney+@totalMoney;
  64. UPDATE T_FeeExist SET LJGLF=@LJGLF,LJGSF=@LJGSF,QTFY=@QTFY,WXJDTotalMoney=@WXJDTotalMoney WHERE DLSID = @dlsId;
  65. END
  66. ELSE --第一次向费用池写入某代理商费用,添加新记录
  67. BEGIN
  68. INSERT INTO
  69. T_FeeExist(DLSID,LJGLF,LJGSF,QTFY,WXJDTotalMoney) values(@dlsId,@glf,@gsf,@xj,@totalMoney);
  70. END
  71. SET @err1=@@ERROR
  72. --更新维修鉴定表是否已提交到费用池字段
  73. UPDATE T_DLS_WXJD SET IsFYC='是' WHERE ID=@wxjdId
  74. SET @err2=@@ERROR
  75. --判断是否出错
  76. IF (@Err1=0 and @Err2=0 )
  77. COMMIT TRANSACTION --提交事务
  78. ELSE
  79. ROLLBACK TRANSACTION --事务回滚
  80. END

统计费用就简单的介绍到这里了,这里主要记录的关键点就是如何汇总各表的数据及存储过程中对数值进行判断!

人气教程排行