求个sql,重谢

ouyangxiaolin 2018-03-08 08:04:52
一个订单可能有多条分期收款记录,现在以记录表为维度,连接查询以收款时间为过滤条件,每条收款记录统计该条收款时间以前的收款金额总和,等于是一个订单分期付款然后统计,例如订单1有3条分期收款记录,

order表
订单id 金额
orderId money
1 90

record订单记录表
记录id 订单id 收款金额 收款时间
id orderId reMonery reTime
1 1 20 2016-02-01 00:00:00
2 1 30 2017-02-02 20:00:01
3 1 40 2018-02-03 08:00:01

我想要的结果, 已收款金额 未收款金额
id orderId money sum(receiveMoney) sum(noReceiveMoney) reTime
1 1 90 20 70 2016-02-01 00:00:00
2 1 90 50 40 2017-02-02 20:00:01
3 1 90 90 0 2018-02-03 08:00:01

求个大神!
...全文
735 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouyangxiaolin 2018-03-09
  • 打赏
  • 举报
回复
引用 2 楼 crszhi 的回复:

SELECT a.id,o.*,a.reMonery+SUM(IFNULL(r.reMonery,0)),o.money-(a.reMonery+SUM(IFNULL(r.reMonery,0))),a.reTime
FROM record a
LEFT JOIN `order` o ON o.orderId = a.orderId
LEFT JOIN (SELECT r.*,a.reTime AS 'r' FROM record a 
LEFT JOIN record r ON a.orderId = r.orderId 
WHERE r.reTime < a.reTime 
ORDER BY r.reTime
) r ON r.r = a.reTime AND a.orderId = r.orderId
GROUP BY a.id
真是太谢谢你了老哥!明天我去试下。
ouyangxiaolin 2018-03-09
  • 打赏
  • 举报
回复
还是自己粗心看错了,谢谢老哥了
ouyangxiaolin 2018-03-09
  • 打赏
  • 举报
回复
money sum(receiveMoney) sum(noreceiveMoney) 1963725 150000000350002 150000000350004 200.00 100.00 100.00 2018-03-09 09:32:43 1963727 150000000350002 150000000350004 200.00 1000.00 -800.00 2018-03-09 09:48:05 改时间后就正确: 1963725 150000000350002 150000000350004 200.00 100.00 100.00 2018-03-09 09:32:43 1963727 150000000350002 150000000350004 200.00 200.00 0.00 2018-03-10 09:48:05
ouyangxiaolin 2018-03-09
  • 打赏
  • 举报
回复
引用 12 楼 crszhi 的回复:
之前我搞错了,现在貌似没问题了,非常谢谢,看私信
crszhi 2018-03-09
  • 打赏
  • 举报
回复
crszhi 2018-03-09
  • 打赏
  • 举报
回复
o.money-(a.reMonery+SUM(IFNULL(r.reMonery,0)))这一列 (a.reMonery+SUM(IFNULL(r.reMonery,0))) 等于360 相减等于0的话,就是你o.money等于360 我用你给的数据测了一下,就算是同年份的也不会有问题,跟年份没关系吧 要不是就是你数据有问题
ouyangxiaolin 2018-03-09
  • 打赏
  • 举报
回复
引用 8 楼 crszhi 的回复:
你确定你的分期总金额没有大于order的金额?
确定,没有大于
crszhi 2018-03-09
  • 打赏
  • 举报
回复
你确定你的分期总金额没有大于order的金额?
ouyangxiaolin 2018-03-09
  • 打赏
  • 举报
回复
引用 7 楼 ouyangxiaolin 的回复:
[quote=引用 6 楼 crszhi 的回复:]
是哪里错了?结果集贴出来?

a.reMonery+SUM(IFNULL(r.reMonery,0))
o.money-(a.reMonery+SUM(IFNULL(r.reMonery,0)))
这两列计算结果会错误,o.money-(a.reMonery+SUM(IFNULL(r.reMonery,0)))这一列还会有负数,当record表中orderId相同的两条数据且年份一样的时候[/quote]

ouyangxiaolin 2018-03-09
  • 打赏
  • 举报
回复
引用 6 楼 crszhi 的回复:
是哪里错了?结果集贴出来?
a.reMonery+SUM(IFNULL(r.reMonery,0)) o.money-(a.reMonery+SUM(IFNULL(r.reMonery,0))) 这两列计算结果会错误,o.money-(a.reMonery+SUM(IFNULL(r.reMonery,0)))这一列还会有负数,当record表中orderId相同的两条数据且年份一样的时候
crszhi 2018-03-09
  • 打赏
  • 举报
回复
是哪里错了?结果集贴出来?
ouyangxiaolin 2018-03-09
  • 打赏
  • 举报
回复
引用 4 楼 ouyangxiaolin 的回复:
[quote=引用 2 楼 crszhi 的回复:]

SELECT a.id,o.*,a.reMonery+SUM(IFNULL(r.reMonery,0)),o.money-(a.reMonery+SUM(IFNULL(r.reMonery,0))),a.reTime
FROM record a
LEFT JOIN `order` o ON o.orderId = a.orderId
LEFT JOIN (SELECT r.*,a.reTime AS 'r' FROM record a 
LEFT JOIN record r ON a.orderId = r.orderId 
WHERE r.reTime < a.reTime 
ORDER BY r.reTime
) r ON r.r = a.reTime AND a.orderId = r.orderId
GROUP BY a.id
老哥,今天我试了下,发现还有个小问题,就是record表中orderId相同的两条数据,如果这两条数据的reTime年份一样的话就会得到错误的结果,如果把年份改成不一样就可以得到正确的结果,例如 结果错误, 2017-08-24 11:07:12 2017-08-28 16:46:06 结果正确。 2017-08-24 11:07:12 2018-08-28 16:46:06 是时间的比较问题吗?[/quote] 用DATE_FORMAT格式化后去比较也没用
ouyangxiaolin 2018-03-09
  • 打赏
  • 举报
回复
引用 2 楼 crszhi 的回复:

SELECT a.id,o.*,a.reMonery+SUM(IFNULL(r.reMonery,0)),o.money-(a.reMonery+SUM(IFNULL(r.reMonery,0))),a.reTime
FROM record a
LEFT JOIN `order` o ON o.orderId = a.orderId
LEFT JOIN (SELECT r.*,a.reTime AS 'r' FROM record a 
LEFT JOIN record r ON a.orderId = r.orderId 
WHERE r.reTime < a.reTime 
ORDER BY r.reTime
) r ON r.r = a.reTime AND a.orderId = r.orderId
GROUP BY a.id
老哥,今天我试了下,发现还有个小问题,就是record表中orderId相同的两条数据,如果这两条数据的reTime年份一样的话就会得到错误的结果,如果把年份改成不一样就可以得到正确的结果,例如 结果错误, 2017-08-24 11:07:12 2017-08-28 16:46:06 结果正确。 2017-08-24 11:07:12 2018-08-28 16:46:06 是时间的比较问题吗?
crszhi 2018-03-08
  • 打赏
  • 举报
回复

SELECT a.id,o.*,a.reMonery+SUM(IFNULL(r.reMonery,0)),o.money-(a.reMonery+SUM(IFNULL(r.reMonery,0))),a.reTime
FROM record a
LEFT JOIN `order` o ON o.orderId = a.orderId
LEFT JOIN (SELECT r.*,a.reTime AS 'r' FROM record a 
LEFT JOIN record r ON a.orderId = r.orderId 
WHERE r.reTime < a.reTime 
ORDER BY r.reTime
) r ON r.r = a.reTime AND a.orderId = r.orderId
GROUP BY a.id
crszhi 2018-03-08
  • 打赏
  • 举报
回复

SELECT a.id,o.*,a.reMonery+SUM(IFNULL(r.reMonery,0)),o.money-(a.reMonery+SUM(IFNULL(r.reMonery,0))),a.reTime
FROM record a
LEFT JOIN ORDER o ON o.orderId = a.orderId
LEFT JOIN (SELECT r.*,a.reTime AS 'r' FROM record a 
LEFT JOIN record r ON a.orderId = r.orderId 
WHERE r.reTime < a.reTime 
ORDER BY r.reTime
) r ON r.r = a.reTime 
GROUP BY a.id

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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