簡體   English   中英

MySQL查詢左連接的兩個表-得到錯誤的結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM