如何从另一个MySQL表计算值?

时间:2018-10-17 17:27:07

标签: mysql

我有两个mysql表

付款表如下

id invoiceID   type  amount  date
1  0001        cash  1.00  2018-10-16
2  0001        cash  2.00  2018-10-16
3  0001        cash  1.00  2018-10-17
4  0001        cash  1.00  2018-10-17
5  0002        cash  5.00  2018-10-17

钱表

id  type  amount  date
1   CASH 10.00  2018-10-16
2   CARD 20.00  2018-10-16
3   CASH 18.00  2018-10-17
4   CARD 90.00  2018-10-17

通过在付款表中使用InvoiceID

  1. 总结所有现金金额属于发票ID(含日期)。 例如3是现金的总和属于2018-10-16 和2是基于上表示例的属于208-10-17的现金总额。

2。从类型为现金和日期2018-10-16的货币表中减去3(总金额)(将在货币类型为2018-10-16的货币表中获得现金7)

3。从现金表中键入现金和日期2018-10-17的金额中减去2(总金额)。(将在2018-10-17的现金表中获得现金16)

预期产量应该

钱表

id  type  amount  date
1   CASH 7.00  2018-10-16
2   CARD 20.00  2018-10-16
3   CASH 16.00  2018-10-17
4   CARD 90.00  2018-10-17

我只有发票ID。首先要求从付款表中查找现金的添加日期均属于特定的发票ID(0001),例如2018-10-16和2018-10-17

1 个答案:

答案 0 :(得分:0)

  • 首先,在Derived table中,为invoiceID = '0001'type的每种组合确定date总额。为此,我们在Group Bytype上使用date,然后使用SUM()函数确定总金额。
  • 现在,在Left Joinmoney上,从date表到先前确定的派生表执行type
  • 从金额表中减去总额。如果派生表中没有匹配的行,请使用Coalesce()函数将其视为0。

尝试以下操作(似乎是you want to Update the table):

UPDATE
  money AS m
LEFT JOIN 
  (
   SELECT 
     type, 
     SUM(amount) AS total_amount, 
     date 
   FROM payment 
   WHERE invoiceID = '0001'
   GROUP BY type, date
  ) AS dt 
  ON dt.type = m.type AND 
     dt.date = m.date 
SET m.amount = m.amount - COALESCE(dt.total_amount, 0)