我有两个表:
table: loan
--------------------------------------------------------
id | advance_id | loan_amount | deposit_amount | date
--------------------------------------------------------
1 | 22556678 | 5000 | 0 | 2015-02-06
--------------------------------------------------------
table: advance
--------------------------------------------------------
id | advance_id | advance_amount | purpose | date
--------------------------------------------------------
1 | 22556678 | 20000 | purchase | 2015-01-30
2 | 22556678 | 10000 | purchase | 2015-01-31
--------------------------------------------------------
我的代码是:
SELECT a.advance_id, sum(a.advance_amount) as adv_amount, a.purpose, a.date, sum(l.loan_amount) as loan_amount FROM advance as a INNER JOIN loan as l ON a.advance_id=l.advance_id GROUP BY a.advance_id HAVING sum(l.loan_amount)-sum(l.deposit_amount)>0
说明:表'advance'是用于提前的表,而表'loan'是用于贷款帐户的表 . 为了相同的目的,可以多次使用预付款(此处购买产品) . 每个进步都由预先ID标识 . 由于两个进步是出于同一目的(这里是购买产品),它们将具有相同的advance_id . 另一方面,贷款是针对任何预付款 . 贷款也可以多次违反同样的进展 . 如果任何贷款将被偿还,它将被插入到deposit_amount列中以对照advance_id .
在loan_page.php中,只有在任何贷款未付/未调整时才会显示贷款 . 为了识别它,我必须通过以下代码计算贷款和存款列与相同的预付ID:
GROUP BY a.advance_id HAVING sum(l.loan_amount)-sum(l.deposit_amount)>0
然后,如果任何贷款未付,我必须确定对每个advance_id承担多少贷款 . 所以我还要选择以下内容:
sum(l.loan_amount)
我获取的输出将是:
echo 'Total loan Amount: '.$row['loan_amount'].'
';
echo 'Advance ID: '.$row['advance_id'].'
';
echo 'Advance Amount: '.$row['adv_amount'].'
';
echo 'Purpose of Advance: '.$row['purpose'];
上面的代码工作得很好,除了总贷款金额是双倍(在这种情况下这里是10000)虽然它将是5000.我认为我的mysql查询的GROUP BY或HAVING子句有错误 .
请告诉我,如何更正代码,以便sum(l.loan_amount)在这种情况下为5000,而不是10000 .
2 回答
loan_amount为double的原因是因为您使用advance_id在表之间进行内部联接 . 由于advance_id在advance_table中出现两次,因此贷款行将出现两次 . 在视觉上,连接给你这样的东西:
因此,当您在l.loan_amount上执行聚合时,它将被计数两次 . 为了解决这个问题,我会自己对每个表进行聚合,然后将它们连接在一起 . 例如,只需从贷款表中获取advance_id和SUM(loan_amount),如下所示:
我注意到你的原始
HAVING
子句检查loan_amount - deposit_amount,你可以在上面的查询中做到这一点:接下来,在advance表中预先形成必要的聚合,如下所示:
然后,我会加入这两个表来获取您需要的值:
NOTE
我没有列出目的或日期,因为它们在高级表中不一致 . 你将不得不考虑每个案例 . 如果两行的目的不同怎么办?日期不同,如果有的话,您需要退回哪个日期?一旦你知道了,你可以将它们添加到这个查询中,可能在'advance'子查询中 .
这是一个SQL Fiddle的例子 .
您希望使用
union all
而不是join
将表格组合在一起 . 或者,或者,在加入之前聚合 .这是
union all
版本: