我的数据库中有这三个表:
tblCustomer (id,name,address)
tblLoan (id,customerId,LoanAmount,date)
tblPayment (id,customerId,ReceivedAmount,date)
我想找到一个客户的贷款总额和他们支付的金额。
我写了这个查询:
SELECT c.fname, SUM(l.amount), SUM(p.amount)
FROM tblCustomer c
JOIN tblLoan l ON (l.customerId = c.id)
JOIN tblPayment p ON (p.customerId = c.id)
WHERE c.id = 3;
它会返回结果,但它们不正确。
答案 0 :(得分:1)
首先,正如其他人所提到的,你的语法可能不正确,因为你没有匹配的列名,但是你说你的结果不正确,所以我认为你的问题不是你的问题你的查询..
我认为您最有可能的问题是,通过将两个表连接在一起,每个客户的行显示两次。我认为你的错误'是正确的。结果是你所期望的两倍?让我举例说明那些不了解的人。考虑这个数据集,缩短列值:
tblCustomer:
| id | name |
+----+------+
| 1 | Adam |
| 2 | John |
| 3 | Jane |
tblLoan,为简单起见,我们说支付表看起来是一样的:
| customerID | loanAmount |
+------------+------------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
| 3 | 300 |
| 2 | 200 |
如果我执行以下查询(没有求和值,只需获取我想要的值:
SELECT c.id, c.name, l.loanAmount, p.receivedAmount
FROM tblCustomer c
JOIN tblLoan l ON l.customerid = c.id
JOIN tblPayment p ON p.customerid = c.id
WHERE c.id = 3;
返回此结果集:
| id | name | loanAmount | receivedAmount |
+----+------+------------+----------------+
| 3 | Jane | 100 | 100 |
| 3 | Jane | 100 | 300 |
| 3 | Jane | 300 | 100 |
| 3 | Jane | 300 | 300 |
因此,请注意,因为我们根据与第三个表的关系加入两个表,实际上是在创建导致问题的笛卡尔积。所以,我建议你做的是使用这两个表的子查询。一个子查询将提取贷款值,一个是支付值,您可以将这些值加在一起作为id值。
看起来像这样:
SELECT t.id, t.totalLoan, w.totalReceived
FROM(SELECT c.id, SUM(l.loanAmount) AS totalLoan
FROM tblCustomer c
JOIN tblLoan l ON l.customerid = c.id
WHERE c.id = 3) t
JOIN(SELECT c.id, SUM(p.receivedAmount) AS totalReceived
FROM tblCustomer c
JOIN tblPayment p ON p.customerid = c.id
WHERE c.id = 3) w
ON t.id = w.id;
这应该给你你想要的价值。这是我在SQL Fiddle上测试的内容。
答案 1 :(得分:-1)
仅供参考,您的栏目名称错误!!!
fname
tblCustomer
的列
amount
tblLoan
的列
amount
tblPayment
的列
醇>
如果您没有合适的列名,则无法获得正确的结果。即使使用别名,您的列名也应该与数据库表中的完全相同一样。这是因为,您在JOIN
次查询中使用 TABLES ,而不是 COLUMNS 。
因此,请按以下方式重新编写查询:
SELECT c.name, SUM(l.LoanAmount), SUM(p.ReceivedAmount)
FROM tblCustomer c
JOIN tblLoan l ON l.customerId = c.id
JOIN tblPayment p ON p.customerId = c.id
WHERE c.id = 3
请注意,ON
中的JOIN
子句不需要括号。