2011-02-22 92 views
2

我有两个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   | 
+-----------+---------------+----------------+ 
+0

请提供表格定义和样本数据 – 2011-02-22 18:22:35

+1

您可以在'收益'上不存在`redemption`上的common_id吗?或相反亦然? – Lamak 2011-02-22 18:33:45

回答

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和可能的另一种UNIONRIGHT JOIN

相关问题