2013-02-23 95 views
0

我想創建一個選擇存儲過程返回值的數量不同實例。但是,如果沒有明顯的情況下存在,它應該返回0。下面的查詢,幾乎沒有我需要的一切MySQL的SELECT與WHERE子句不包括與量的結果「0」

SELECT br.barangay,COUNT(DISTINCT cr.cr_patient_no) as `amount` 
FROM barangay as br LEFT JOIN case_report_main as cr on cr.cr_barangay = br.barangay 
GROUP BY br.barangay 
ORDER BY br.barangay ASC 

此代碼返回列「馬蘭」其中包含的位置,而「計數」列名。不過,我還需要能夠使用WHERE子句搜索它們。

WHERE cr.cr_date_onset BETWEEN '2010-01-01' AND '2014-12-12' 

我需要包括該0量等的結果如下:

'NAME1'|'1' 
'NAME2'|'0' 
'NAME3'|'4' 
'NAME4'|'0' 

但是,當我添加WHERE子句,它刪除與量0

'NAME1'|'1' 
'NAME3'|'4' 
所有結果

有人可以爲此提供解決方案嗎?

+0

您確定該日期範圍內有0個值嗎? – 2013-02-23 08:00:43

+0

嘗試使用ISNULL(COUNT(*),0) – 2013-02-23 08:03:10

+0

是的,我相信有。來自不帶where子句的版本的查詢結果看起來就像它在示例中那樣。 我給ISNULL看看 – user1849239 2013-02-23 08:10:28

回答

2

您的WHERE子句中加上:

cr.cr_date_onset IS NULL OR cr.cr_date_onset BETWEEN '2010-01-01' AND '2014-12-12' 
+0

聰明傑克':D' + 1也。 – 2013-02-23 08:17:48

+0

這和JW的答案都有效。感謝大家的意見和建議。 – user1849239 2013-02-23 08:22:09

0

嘗試此查詢:

SELECT br.barangay,ifnull(COUNT(DISTINCT cr.cr_patient_no),0) as `amount` 
    FROM barangay as br LEFT JOIN case_report_main as cr on cr.cr_barangay = br.barangay 
    where cr.cr_date_onset between '2010-01-01' and '2014-12-12' 
    GROUP BY br.barangay 
    ORDER BY br.barangay ASC 
+1

不,這不會返回零計數的記錄。 – Pedigree 2013-02-23 08:14:30

+0

我不認爲這會實際工作。 – 2013-02-23 08:14:48

+0

好的。讓我試試其他的:)。感謝 – 2013-02-23 08:17:04

2

你需要添加條件對ON條款,而不是在WHERE條款

SELECT br.barangay, 
     COUNT(DISTINCT cr.cr_patient_no) AS `amount` 
FROM barangay AS br 
     LEFT JOIN case_report_main AS cr 
      ON cr.cr_barangay = br.barangay AND 
       cr.cr_date_onset BETWEEN '2010-01-01' AND '2014-12-12' 
GROUP BY br.barangay 
ORDER BY br.barangay ASC 
+2

+1條件可以在WHERE過,但加上一個或NULL :) – 2013-02-23 08:17:17

+0

@Jack是啊,我沒想到它。 hehehe – 2013-02-23 08:18:36

+1

雖然這也不錯,條件正好在正確的位置:) – 2013-02-23 08:22:38