我可能可以通过PHP代码执行以下操作,但我认为它很可能是在MySQL中完成的,因此只需寻找可以在查询中帮助我的人。

我有一个合同表,该表定义了客户每月的付款,例如,每月500英镑。然后,我还有另一个表叫做租金,每月输入租金。每个租金的状态为已付,未付和部分。

到目前为止,我的查询如下,我是否必须执行多个子查询,还是它们的简单方法。

SELECT cc.property_id, cc.property_rent, r.order_total, r.order_status,
       SUM(CASE WHEN r.order_status = 'Partial' THEN cc.property_rent - r.order_total ELSE 0 END) AS partial_rent_owed
FROM t_customers_contract cc JOIN
     t_customers_rent r
     ON cc.customer_id = r.customer_id                                                   WHERE cc.property_id = 62 AND r.transaction_type = 'rent' AND
      (r.date_created BETWEEN '2017-04-05' AND '2019-04-05')
GROUP BY cc.property_id


基本上,如果租金状态是部分的,则从通常的租金中减去租金,然后从所欠的总额中扣除。

期望的结果将是每个属性所欠的总金额和已贡献的总金额,如下所示:

property_id,total_rent_made,total_rent_owed

当前合同表的结构和数据如下:

mysql - MySQL查询以基于部分付款来计算所欠的租金-LMLPHP

当前的租金表结构和数据如下:

mysql - MySQL查询以基于部分付款来计算所欠的租金-LMLPHP

如您所见,order_id 20和27是部分付款,根据合同,这些ID的实际付款应为750和700。

最佳答案

我已经解决了,这是以下查询。如果任何人都可以改进它,请根据性能或更清洁提出建议。

SELECT cc.property_id,
SUM(CASE WHEN r.order_status = 'Partial' THEN (cc.property_rent - r.order_total) ELSE 0 END) AS partial_rent_owed
FROM t_customers_contract cc JOIN t_customers_rent r ON (cc.property_id = r.property_id)
WHERE cc.contract_id = r.contract_id
AND cc.customer_id = 7866
AND r.transaction_type = 'rent'
AND (r.date_created BETWEEN '2016-04-05' AND '2019-04-05')
GROUP BY cc.property_id

08-03 20:09