[英]mysql query for two tables with left join- getting wrong results
我用左聯接聯接兩個表,以得到總和結果,但是給出錯誤的結果。 這是我的
table1
| id | event | currency | amount |
|----|-------|----------|--------|
| 1 | HSA | USD | 2000 |
| 2 | DMME | USD | 3000 |
| 3 | HSI | INR | 1500 |
| 4 | HSI | INR | 1500 |
表2
| id | table1_id | rcvamount | adjamount |
|----|-----------|-----------|-----------|
| 1 | 1 | 1980 | 20 |
| 2 | 2 | 1000 | 180 |
| 3 | 2 | 1500 | 20 |
| 4 | 4 | 1487 | 13 |
這是我的查詢
SELECT
T1.event,T1.currency,
SUM(T1.total) AS Totalvalue,
SUM(T1.received) AS Received,
(T1.bal) AS balance
FROM (SELECT
table1.id,
table1.amount AS total,
SUM(table2.rcvamount+table2.adjamount) AS received,
((table1.amount)- sum(table2.rcvamount+table2.adjamount)) AS bal,
table1.event,
table1.currency
FROM table1 LEFT JOIN table2 ON table1.id=table2.table1_id
group by table1.id)T1
Group By T1.event,T1.currency
但是當我運行此查詢時,錯誤的結果如下。當涉及到稱為HSI的第三個事件時,表2中的ID號3沒有任何行。 結果應按事件和貨幣分組。
| event | currency | Totalvalue | Received | balance |
|-------|----------|------------|----------|---------|
| DMME | USD | 3000 | 2700 | 300 |
| HSA | USD | 2000 | 2000 | 0 |
| HSI | INR | 3000 | 1500 | NULL |
但是實際結果應該如下
| event | currency | Totalvalue | Received | balance |
|-------|----------|------------|----------|---------|
| DMME | USD | 3000 | 2700 | 300 |
| HSA | USD | 2000 | 2000 | 0 |
| HSI | INR | 3000 | 1500 | 1500 |
我沒有弄錯查詢的地方。請幫助我進行排序。謝謝。
您使用的是LEFT JOIN
因此您將擁有所有第一張表行,即使它們在第二張表中沒有通過所需的LEFT JOIN
匹配。
以您在第一個表中的情況為例,id = 3在第二個表中不匹配,因此您得到NULL結果。 ( SELECT * FROM table2 WHERE table1_id =3
將給出0個結果)。
為了避免這種情況,請使用INNER JOIN
:
SELECT T1.event, T1.currency, SUM( T1.total ) AS Totalvalue,
SUM( T1.received ) AS Received, ( T1.bal) AS balance
FROM (
SELECT table1.id, table1.amount AS total,
SUM( table2.rcvamount + table2.adjamount ) AS received,
((table1.amount) - sum( table2.rcvamount + table2.adjamount ))AS bal,
table1.event, table1.currency
FROM table1
INNER JOIN table2 ON table1.id = table2.table1_id
GROUP BY table1.id
)T1
GROUP BY T1.event, T1.currency
試試這個, COALESCE()
會將每個null
轉換為0
SELECT T1.event, T1.currency, SUM( T1.total ) AS Totalvalue, SUM( T1.received ) AS Received, (
T1.bal
) AS balance
FROM (
SELECT table1.id, table1.amount AS total, SUM( COALESCE( table2.rcvamount, 0 ) + COALESCE( table2.adjamount, 0 ) ) AS received, (
COALESCE( table1.amount, 0 ) - sum( COALESCE( table2.rcvamount, 0 ) + COALESCE( table2.adjamount, 0 ) )
) AS bal, table1.event, table1.currency
FROM table1
LEFT JOIN table2 ON table1.id = table2.table1_id
GROUP BY table1.id
)T1
GROUP BY T1.event, T1.currency
它會為你工作
select tp.id,tp.event,tp.currency,
tp.totalvalue,
tr.received,
(tp.totalvalue - tr.received) AS balance
from
(
select max(id)id,event,currency,amount,sum(amount)as totalvalue from t1
group by t1.event
)tp
inner join
(
select id,table1_id,rcvamount,adjamount,(sum(rcvamount) + sum(adjamount))as received
from t2
group by table1_id
order by t2.adjamount desc
)tr
on tp.id = tr.id
group by tp.event
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.