2014-09-04 31 views
0

我正在搜索並找不到 解決我的問題的答案。MySQL查詢以GROUP BY HOUR填充NULL值

我想打一個小時的報告,我將與此查詢

SELECT 
HOUR(ce.datetime_entry_queue) hour, 
COUNT(ce.id) incoming, 
COUNT(IF(ce.datetime_init IS NULL,1,NULL)) dropped, 
COUNT(IF(ce.datetime_init IS NOT NULL,1,NULL)) answered 
FROM 
call_center.call_entry ce 
WHERE 
ce.datetime_entry_queue>='2014-09-04 15:00:00' AND 
ce.id_campaign='1' 
GROUP BY HOUR(ce.datetime_entry_queue) 

這讓將產生我想要的結果。並給我結果如下

|hour|incoming|dropped|answered| 
|----|--------|-------|--------| 
| 15 | 200 | 2 | 198 | 
| 16 | 220 | 10 | 210 | 
| 17 | 154 | 0 | 154 | 

女巫是好的,但如果有一個在16小時無呼叫從16:00至17:00, 我會得到以下結果。

|hour|incoming|dropped|answered| 
|----|--------|-------|--------| 
| 15 | 200 | 2 | 198 | 
| 17 | 154 | 0 | 154 | 

我怎樣才能查詢到的空值的行零個值返回這樣

|hour|incoming|dropped|answered| 
|----|--------|-------|--------| 
| 15 | 200 | 2 | 198 | 
| 16 | 0 | 0 | 0 | 
| 17 | 154 | 0 | 154 | 

我已經與創建包含小時表試過(0 - 23)

CREATE TABLE `report_hours` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `hour` INT(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) 
COLLATE='latin1_swedish_ci' 
ENGINE=InnoDB 
AUTO_INCREMENT=25; 

查詢:

SELECT 
rh.hour, 
COUNT(ce.id) incoming, 
COUNT(IF(ce.datetime_init IS NULL,1,0)) dropped, 
COUNT(IF(ce.datetime_init IS NOT NULL,1,0)) answered 
FROM 
call_center.report_hours rh 
LEFT JOIN 
call_center.call_entry ce 
ON 
HOUR(ce.datetime_entry_queue)=rh.hour 
WHERE 
ce.datetime_entry_queue>='2014-09-05 15:00:00' AND 
ce.id_campaign='1' 
GROUP BY rh.hour 

請幫忙。

謝謝

回答

0

這必須工作:

SELECT 
    rh.hour, 
    COUNT(ce.id) incoming, 
    COUNT(IF(ce.datetime_init IS NULL,1,NULL)) dropped, 
    COUNT(IF(ce.datetime_init IS NOT NULL,1,NULL)) answered 
FROM 
    call_center.report_hours rh 
LEFT JOIN 
    call_center.call_entry ce ON 
    HOUR(ce.datetime_entry_queue)=rh.hour AND 
    ce.datetime_entry_queue>='2014-09-05 15:00:00' AND 
    ce.id_campaign='1' 
GROUP BY rh.hour 

哪些錯誤與您的查詢:

  1. COUNT(IF(ce.datetime_init IS NULL,1,0)) - 計數所有行,工作正確更改0NULL。也可以改爲:SUM(IF(ce.datetime_init IS NULL,1,0))

  2. 當使用LEFT JOIN table_name時,與指定表相關的所有條件表達式必須在LEFT JOIN ... ON子句下。如果它們在WHERE以下,則有效地過濾所有具有NULL值的行(當call_center.call_entry表中不匹配時)。

+0

工程就像一個魅力:-)謝謝 – user1972670 2014-09-04 19:16:01

+0

很高興聽到!添加了一些解釋。 – Rimas 2014-09-04 19:49:06