从另一个表中的总和中减去一个表中的总和

时间:2011-02-22 18:16:14

标签: mysql

我有两个mysql表:earningredemptionearning表中的数据会增加运行余额,redemption表中的数据会从该余额中减去。每个表都有一个hours列和一个amount列。

(有很多原因可以解释为什么这些不是同一个表中的负值和正值,但即使有这些原因,我现在也认识到这可能是一个糟糕的架构设计,但是......现在我已经坚持了它)。

如何获取hoursamounts字段的当前余额?更具体地说,我如何编写一个能够给我SUM(earning.hours) - SUM(redemption.hours)SUM(earning.amount) - SUM(redemption.amount)的查询,按Common_ID分组?


一些示例数据。每个表中都有其他字段,但我现在并不关心它们。

Earning:

+----+-----------+-------+--------+
| id | common_id | hours | amount |
+----+-----------+-------+--------+
| 1  | 234       | 1.03  | 15.75  |
| 2  | 234       | 2.06  | 33.00  |
| 3  | 237       | 2.11  | 12.29  |
| 4  | 237       | 3.50  | 18.63  |
+----+-----------+-------+--------+

Redemption:

+----+-----------+-------+--------+
| id | common_id | hours | amount |
+----+-----------+-------+--------+
| 1  | 234       | 2.50  | 30.00  |
| 2  | 234       | 0.50  | 5.68   |
| 3  | 237       | 1.00  | 8.00   |
+----+-----------+-------+--------+

Desired result:

+-----------+---------------+----------------+
| common_id | hours_balance | amount_balance |
+-----------+---------------+----------------+
| 234       | 0.09          | 13.07          |
| 237       | 4.61          | 22.92          |
+-----------+---------------+----------------+

1 个答案:

答案 0 :(得分:2)

您需要单独执行分组。

SELECT e.Common_ID,
  SUM(e.hours) - MIN(g.SumHours),
  SUM(e.amount) - MIN(g.SumAmount)
FROM earning e JOIN (
    SELECT Common_ID, SUM(hours) SumHours, SUM(amount) SumAmount
    FROM redemption
    GROUP BY Common_ID
  ) g ON e.Common_ID = g.Common_ID
GROUP BY Common_ID

注意:正如Lamak指出的那样,如果两个表中都不存在common_id,则需要LEFT JOIN,可能需要另一个UNION RIGHT JOIN }}