2016-04-16 75 views
0

我有一個SQL查詢,從三列返回總表的,這是我的查詢:如何查詢的結果設置爲零,如果其條件爲假

SELECT c.*, 
    (select sum(t.incoming) - sum(t.outgoing) from transactions t where t.client_id = c.id and currency = 'Dollar') + 
    (select sum(t.equal_to_dollar) from transactions t where t.incoming != 0 and currency != 'Dollar' and t.client_id = c.id) - 
    (select sum(t.equal_to_dollar) from transactions t where t.outgoing != 0 and currency != 'Dollar' and t.client_id = c.id) 
as total from clients c 

我的問題是,當一個第二個和第三個(內部選擇)條件不符合它會返回空值,並導致整個選擇返回null。因爲空值不能與任何值相加或相減。
我想知道是否有任何方法來將其條件評估爲false的查詢結果設置爲零,因此它不會影響整個查詢,並且查詢將返回滿足where子句中條件的那些部分的值。
我不知道當結果很重要時它是計算價值的好方法,它應該如此精確?
,我要感謝您在您的幫助:)

+0

的可能的複製[選擇一列如果對方是空](http://stackoverflow.com/questions/5697942/select-one-column (如果其他是空)(或者[如果字段在MySQL中爲null,則返回0](http://stackoverflow.com/questions/3997327/return-0-if-field-is-null-in -mysql)) –

回答

1

你可以用coalesce()

select c.*, 
     ((select coalesce(sum(t.incoming), 0) - coalesce(sum(t.outgoing), 0) from transactions t where t.client_id = c.id and currency = 'Dollar') + 
     (select coalesce(sum(t.equal_to_dollar), 0) from transactions t where t.incoming <> 0 and currency <> 'Dollar' and t.client_id = c.id) - 
     (select coalesce(sum(t.equal_to_dollar), 0) from transactions t where t.outgoing <> 0 and currency <> 'Dollar' and t.client_id = c.id) 
     ) as total 
from clients c ; 

每個子查詢是一個聚合沒有group by,所以每返回一行 - 其中,如果沒有匹配,則將具有值NULLCOALESCE()將其轉換爲0.

但是,沒有三個子查詢的理由。只需使用一個子查詢和使用條件聚集做算了一筆賬:

select c.*, 
     (select sum(case when currency = 'Dollar' 
         then coalesce(t.incoming, 0) - coalesce(t.outgoing, 0) 
         when t.incoming <> 0 
         then coalesce(t.equal_to_dollar, 0) 
         when t.outgoing <> 0 
         then - coalesce(t.equal_to_dollar, 0) 
         else 0 
        end) 
     from transactions t 
     where t.client_id = c.id 
     ) as total 
from clients c ; 
+0

感謝他的工作正常 – AliDK

+0

你能告訴我如何檢查你寫的方法中的兩個條件。你能寫一個鏈接關於這個方法的更多信息 – AliDK

+0

@AliDK。 。 。我不確定你是什麼意思。也許你應該問另一個問題。 –

相關問題