2014-10-12 60 views
0

比方說,空值,有兩個表:返回,而不是在SQL查詢中的空集

select * from users; 
+-------+------+ 
| login | type | 
+-------+------+ 
| test1 | A | 
| test2 | A | 
| test3 | B | 
+-------+------+ 

select * from money; 
+-------+--------+------------+ 
| login | amount | date  | 
+-------+--------+------------+ 
| test1 | 10.00 | 1325379661 | 
| test1 | 20.00 | 1357002061 | 
| test2 | 33.30 | 1388538061 | 
+-------+--------+------------+ 

我需要從用戶表登錄&類型字段和選定日期範圍內第二個表格中金額字段的總和。如果選定期間的金額爲空,或者'金錢'表中沒有任何登錄記錄,則返回零值(非空集)。

我做的方式如下:

SELECT u.login,u.type, SUM(m.amount) as amount 
FROM users AS u 
LEFT JOIN money AS m ON m.login=u.login 
WHERE date>1388710861 GROUP BY u.login; 

該查詢返回合理空集,但我需要讓用戶爲他們的名單和零金額:

+-------+------+--------+ 
| login | type | amount | 
+-------+------+--------+ 
| test1 | A | 0.00 | 
| test2 | A | 0.00 | 
| test3 | B | 0.00 | 
+-------+------+--------+ 

這是怎麼回事可能?

+0

我想要得到的結果已經發布了。請看一下。 – Sray 2014-10-12 14:49:44

+0

看看這個: http://stackoverflow.com/questions/7602271/how-do-i-get-sum-function-in-mysql-to-return-0-if-no-values-are-found – Multisync 2014-10-12 14:52:36

+0

我已經試過COALESCE。沒有運氣,返回相同的空集。我的情況通過使用多個連接變得複雜,我想正確的方法在於改變表的連接方式。我已經嘗試了多個變體,甚至子查詢,但得到了相同的結果。此外,我已經搜索了類似的情況Stackoverflow,但沒有找到任何。 – Sray 2014-10-12 14:58:41

回答

2

其空的,因爲你的WHERE條件(日期> 1388710861)過濾所有數據

試試這個

SELECT u.login,u.type, SUM(IF(m.date>1388710861,m.amount,0)) as amount 
FROM users AS u 
LEFT JOIN money AS m ON m.login=u.login 
GROUP BY u.login, u.type; 

當然,它運行速度會變慢。

0

看看你自己的數據, 沒有一個數據與你的條件(日期> 1388710861)。 實際上,列數總是0.

這是標準查詢以獲得每次登錄的總金額。

SELECT u.login,u.type, SUM(m.amount) as amount 
FROM users AS u 
LEFT JOIN money AS m ON m.login=u.login 
GROUP BY u.login, u.type; 

但是,如果你想要得到的結果,每次登錄的情況下 款額(日期> 1388710861)將預覽實際款額 和情況(日期< = 1388710861)將預覽0

你可以試試這個:

SELECT u.login,u.type, 
    Sum(Case When date>1388710861 Then m.amount Else 0 End) as amount 
FROM users AS u 
LEFT JOIN money AS m ON m.login=u.login 
GROUP BY u.login, u.type;