合同(分期及全款)如何统计待回款数据问题如何统计

Dragon_pan 2017-03-21 09:48:20
需求:按一年十二个月统计出某一年合同的待回款数据,涉及到两张表:合同表 、回款表
合同表结构和数据如下:
合同表结构

DROP TABLE IF EXISTS `contract_tb`;
CREATE TABLE `contract_tb` (
`Id` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '合同表主键',
`Payment` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '付款方式(分期 全款)',
`ContractAmount` int(11) DEFAULT NULL COMMENT '合同金额',
`Instalments` smallint(4) DEFAULT NULL COMMENT '分期数',
`CreatedOn` datetime DEFAULT NULL COMMENT '合同签订时间',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
SET FOREIGN_KEY_CHECKS=1;


合同数据

INSERT INTO `contract_tb` (`Id`, `Payment`, `ContractAmount`, `Instalments`, `CreatedOn`) VALUES ('1a1aef75a2394a6dbca9852fb5253c5e', '集中', '10520', '0', '2017-03-17 16:29:04');
INSERT INTO `contract_tb` (`Id`, `Payment`, `ContractAmount`, `Instalments`, `CreatedOn`) VALUES ('2e904eddeadd457781e0b8ea7aa6f2d6', '分期', '52600', '5', '2017-03-13 09:03:28');
INSERT INTO `contract_tb` (`Id`, `Payment`, `ContractAmount`, `Instalments`, `CreatedOn`) VALUES ('2f32f7e0c04a4f37ae2f37133820462a', '集中', '52000', '0', '2017-03-09 10:39:00');
INSERT INTO `contract_tb` (`Id`, `Payment`, `ContractAmount`, `Instalments`, `CreatedOn`) VALUES ('3177ee420b4a4bbabb325c9aa179197e', '集中', '20230', '0', '2017-03-13 17:17:36');
INSERT INTO `contract_tb` (`Id`, `Payment`, `ContractAmount`, `Instalments`, `CreatedOn`) VALUES ('329dfd8c2b33452b98c30aaeedd9e163', '集中', '10000', '0', '2017-03-09 15:49:06');
INSERT INTO `contract_tb` (`Id`, `Payment`, `ContractAmount`, `Instalments`, `CreatedOn`) VALUES ('6d24f88eee31450fa90fd388f65f58e4', '集中', '23000', '0', '2017-03-09 10:39:55');
INSERT INTO `contract_tb` (`Id`, `Payment`, `ContractAmount`, `Instalments`, `CreatedOn`) VALUES ('80d34afa0d65444bb983a41d59a68d13', '集中', '13090', '0', '2017-03-09 10:40:31');
INSERT INTO `contract_tb` (`Id`, `Payment`, `ContractAmount`, `Instalments`, `CreatedOn`) VALUES ('9cee8b80ad9441d79209c482d0c687ab', '集中', '28800', '0', '2017-03-16 11:53:09');
INSERT INTO `contract_tb` (`Id`, `Payment`, `ContractAmount`, `Instalments`, `CreatedOn`) VALUES ('c290d07ca1d74263a7fc3af3110064c6', '分期', '27760', '22', '2017-03-16 10:26:08');
INSERT INTO `contract_tb` (`Id`, `Payment`, `ContractAmount`, `Instalments`, `CreatedOn`) VALUES ('d76a41b2192640d4942bab455ffd8655', '分期', '28800', '5', '2017-03-14 15:19:03');


回款表结构:

DROP TABLE IF EXISTS `refunds_tb`;
CREATE TABLE `refunds_tb` (
`Id` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '主键',
`ContractId` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '合同id',
`RefundsAmount` int(11) DEFAULT NULL COMMENT '回款金额',
`RefundsDate` datetime DEFAULT NULL COMMENT '回款日期'
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
SET FOREIGN_KEY_CHECKS=1;

回款表数据:

INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('011fb5f8355e4e51bf7d9f98facae301', '2e904eddeadd457781e0b8ea7aa6f2d6', '2000', '2018-03-17 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('0373ed1ab31d4904b30bb9d44b46765c', '2e904eddeadd457781e0b8ea7aa6f2d6', '4000', '2017-04-18 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('0706672ec9eb40c69d8258a8db8b4c1a', '2e904eddeadd457781e0b8ea7aa6f2d6', '2000', '2017-05-17 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('17e68107e47c45eaa8cdbab92c13d533', 'd76a41b2192640d4942bab455ffd8655', '8800', '2017-03-14 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('1a474eb28943409f84d86af5a1af1a1b', '6d24f88eee31450fa90fd388f65f58e4', '12200', '2017-03-15 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('1a8f41a9ef7543a6ace0f57d72606bf0', '2e904eddeadd457781e0b8ea7aa6f2d6', '2000', '2017-06-17 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('3426ee0731284e3e83926c27632da26f', '6d24f88eee31450fa90fd388f65f58e4', '1000', '2017-03-09 10:39:55');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('413f90f5f23c4945a223c82dded95e9a', '6d24f88eee31450fa90fd388f65f58e4', '1400', '2017-03-08 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('4ae920aadf5a44f097d579adb89b7e95', '2e904eddeadd457781e0b8ea7aa6f2d6', '2000', '2017-07-14 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('5aee84aff73349639f46357c01a68bcc', 'd76a41b2192640d4942bab455ffd8655', '8800', '2017-03-14 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('64e7d321d2dd42fd8fec06041fd174c1', '2f32f7e0c04a4f37ae2f37133820462a', '52000', '2017-03-09 10:39:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('6939dc954b2c4f0da7cd3033bbfb55b3', '6d24f88eee31450fa90fd388f65f58e4', '1400', '2017-03-08 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('6cee760dd47c4d5c999e8540cbce25b2', '2e904eddeadd457781e0b8ea7aa6f2d6', '2000', '2017-08-17 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('721c474db0304ee2a07ef4113fb73ccf', '2e904eddeadd457781e0b8ea7aa6f2d6', '4000', '2017-03-20 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('76847aa24c5d4df0960b0a17c5f5d053', 'd76a41b2192640d4942bab455ffd8655', '2000', '2017-03-14 15:19:03');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('7725bafcb49f402bb5732ab720d170ff', '6d24f88eee31450fa90fd388f65f58e4', '1400', '2017-03-08 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('83a032cf09bb4915991d780957dd9f02', 'd76a41b2192640d4942bab455ffd8655', '2400', '2017-03-14 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('927560a85a9f4f229967f5ceacf124da', 'd76a41b2192640d4942bab455ffd8655', '6800', '2017-03-14 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('994270838b3c4e799ef7258b0493bd16', '2e904eddeadd457781e0b8ea7aa6f2d6', '1000', '2017-03-13 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('bb1847f61b744bfb886c1f4128dc26e6', '2e904eddeadd457781e0b8ea7aa6f2d6', '1600', '2017-03-13 09:03:28');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('c4dfe761a8c343999cf9db81faeeb103', '6d24f88eee31450fa90fd388f65f58e4', '1400', '2017-03-08 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('cd31b8f9c7e5474ba9f1b3d23371d44d', '6d24f88eee31450fa90fd388f65f58e4', '1400', '2017-03-08 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('f60b08a50a1c49a2bf9c871fcae0eec1', '6d24f88eee31450fa90fd388f65f58e4', '1400', '2017-03-08 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('f94c44e89c6e4b5ab606c3f14521e40e', '2e904eddeadd457781e0b8ea7aa6f2d6', '4000', '2017-03-18 00:00:00');
INSERT INTO `refunds_tb` (`Id`, `ContractId`, `RefundsAmount`, `RefundsDate`) VALUES ('fb1b0148853d4e2696dfab7fff6c4afb', '6d24f88eee31450fa90fd388f65f58e4', '1400', '2017-03-08 00:00:00');

...全文
579 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2017-03-21
  • 打赏
  • 举报
回复
那么你用临时表生成回款计划,再根据回款表打上已执行标记,最后统计临时表。
前台程序都要写上百行代码呢,用SQL————自己努力吧
Dragon_pan 2017-03-21
  • 打赏
  • 举报
回复
我的思路是用统计的月份减去合同签订的月份得到应回款的分期数,然后根据乘以每期回款金额得到累计回款金额,再减去实际累计到这个月的金额,从而得到待回款额,但是不知道怎么写,哪位大神帮解决下吧
Dragon_pan 2017-03-21
  • 打赏
  • 举报
回复
能否用累计应回款-累计实际回款得出待回款数据呢
Dragon_pan 2017-03-21
  • 打赏
  • 举报
回复
明白你的意思,但是这个项目需求的特殊原因,不能简单的生成计划啊
Tiger_Zhao 2017-03-21
  • 打赏
  • 举报
回复
要在设计上简化处理:
保存合同的同时就生成回款记录(标记为计划),实际划款后把对应的记录标记为已执行。
区别标记进行统计就很简单了。
Tiger_Zhao 2017-03-21
  • 打赏
  • 举报
回复
可以啊。只要把计划/已执行明细做出来。
Dragon_pan 2017-03-21
  • 打赏
  • 举报
回复
按月统计累计已还款金额可以统计出来吗
Tiger_Zhao 2017-03-21
  • 打赏
  • 举报
回复
分析/设计不需要花时间?
耗用的工时是编码的几倍。

实际业务没那么简单,就等你做出个用纯SQL实现的案例了。
Dragon_pan 2017-03-21
  • 打赏
  • 举报
回复
我这里为了简化,所以假设分期金额都一样,不用考虑除不尽的情况了
Dragon_pan 2017-03-21
  • 打赏
  • 举报
回复
不好意思,有些细节字段我没放进去,这里面涉及到首期和剩余分期金额不一样,总金额是首期+(总期数-1)*每期的钱 复杂是肯定有的,好几个人月有点夸张了哈
Tiger_Zhao 2017-03-21
  • 打赏
  • 举报
回复
这样一个模块,前后台加起来,从设计到最后验收,要好几个人月的工时呢。
里面全是细节啊。
比如最简单的问题,分期金额除不尽怎么办?
测试数据中正好有:'分期', '27760', '22'

你做伸手党也太容易了!
Dragon_pan 2017-03-21
  • 打赏
  • 举报
回复
大神这么多,真的统计不出来吗

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧