2013-01-14 25 views
0

我有帳戶有其關聯的類別&訂單表,其中訂單可以是債務或信用基於「order_type」字段&付款表,其中存儲支付日期連同金額(no用於債務或信用的負數)。A沒有限制哪裏聲明

目前我使用的是這樣的:

SELECT cat, SUM(p.amount) balance 
FROM accounts a 
LEFT JOIN orders o ON a.id = o.account_id 
LEFT JOIN payments p ON o.id = p.order_id 
WHERE YEAR(p.date) = 2012 
GROUP BY a.cat 

第一個問題:

這一切算作實收的錢是不對的,我已經嘗試過使用

sum(IF(o.order_type = 1, p.amount, p.amount * -1)) 

由於所有金額均爲負數,未能給出正確結果。

第二期:

它不會顯示在沒有付款是類別,這裏的限制因素是,我需要確保我只有2012,但我也希望在計算支付日期如果沒有付款,則用零顯示所有類別。

我接近它的錯誤方式?

如果有人知道任何問題或兩者的解決方案,請提供您的解決方案。

+1

沒有付款的類別在該結果集中根本沒有任何記錄。您需要參加類別表,以便提供「缺失」的。 –

回答

1
SELECT cat, SUM(p.amount) balance 
FROM accounts a 
LEFT JOIN orders o 
    ON a.id = o.account_id 
    AND o.order_type = 1 
LEFT JOIN payments p 
    ON o.id = p.order_id 
    AND YEAR(p.date) = 2012 
GROUP BY a.cat 

年檢查必須處於JOIN狀態,而不是WHERE,因此它不會排除沒有付款的類別。

+0

這是個好主意,我不知道我是如何錯過的,謝謝。 – Frank

0

嘗試這樣:

SELECT cat, SUM(p.amount) balance 
FROM accounts a 
LEFT JOIN orders o 
    ON a.id = o.account_id 
    AND o.order_type = 1 
LEFT JOIN payments p 
    ON o.id = p.order_id 
WHERE YEAR(p.date) = 2012 
GROUP BY a.cat 

但我建議澄清你的數據庫結構,使得它更明顯,如果你的客戶繳足或債務。

+0

不幸的是,現在不可能修改它,因爲它現在已經運行很長時間了,它需要對SQL和後端腳本進行重大修改。 – Frank