2013-02-23 69 views
6

我有兩個表選擇和與內部連接

  • Billsid amount reference

  • Transactionsid reference amount

下面的SQL查詢

SELECT 
    *, 
    (SELECT SUM(amount) 
    FROM transactions 
    WHERE transactions.reference = bils.reference) AS paid 
FROM bills 
GROUP BY id HAVING paid<amount 

意味着來自表Bills的某些行,將paid列添加了關聯交易金額的總和。

但是,它只適用於每個賬單至少有一筆交易。否則,不會返回無交易帳單的行。

可能是因爲我應該做一個內部連接!

所以我嘗試以下方法:

SELECT 
    *, 
    (SELECT SUM(transactions.amount) 
    FROM transactions 
    INNER JOIN bills ON transactions.reference = bills.reference) AS paid 
FROM bills 
GROUP BY id 
HAVING paid < amount 

然而,這種返回支付所有行相同的值!我究竟做錯了什麼 ?

回答

15

使用左連接,而不是一個子查詢:

select b.id, b.amount, b.paid, sum(t.amount) as transactionamount 
from bills b 
left join transactions t on t.reference = b.reference 
group by b.id, b.amount, b.paid 
having b.paid < b.amount 

編輯:
要交易的總和與量,處理您在沒有交易時獲得的空值:

having isnull(sum(t.amount), 0) < b.amount 
+1

但是'Bills'中沒有「付費」列,這必須定義爲交易金額的總和。如果我嘗試修改它以糾正這種情況,我仍然只獲得至少有一筆交易的「Bills」行。 – Klaus 2013-02-23 12:28:03

+0

@Klaus:我明白了,那就是你從那裏得到的......如果沒有交易,總和將爲空,所以你需要處理。見上面的代碼。 – Guffa 2013-02-23 12:34:00

+0

非常感謝,'ifnull'(不是'isnull')和左連接做的伎倆! – Klaus 2013-02-23 12:56:17

2

您需要RIGHT JOIN才能包含所有帳單行。

編輯 所以最終的查詢將會

SELECT 
    *, 
    (SELECT SUM(transactions.amount) 
    FROM transactions 
    WHERE transactions.reference = bills.reference) AS paid 
FROM bills 
WHERE paid < amount 
+0

,將返回所有交易的總和所有的賬單。 – Guffa 2013-02-23 12:20:24

+0

@Guffa描述的問題仍然存在於我的第二次嘗試中。 – Klaus 2013-02-23 12:23:06

+0

如果用「WHERE」替換「INNER JOIN bills ON」 – dotNET 2013-02-23 12:28:48

0

我知道這個線程是舊的,但我今天來到這裏是因爲我遇到了同樣的問題。

請參見另一篇文章中有同樣的問題: Sum on a left join SQL

的答案說,使用GROUP BY在左表。通過這種方式,您可以從左表中獲取所有記錄,並從右表中彙總相應的行。

嘗試使用此:

SELECT 
    *, 
    SUM(transactions.sum) 
FROM 
    bills 
RIGHT JOIN 
    transactions 
ON 
    bills.reference = transactions.reference 
WHERE 
    transactions.sum > 0 
GROUP BY 
    bills.id