MySQL Query用GROUP BY HOUR填充NULL值

时间:2014-09-04 18:43:40

标签: mysql

我正在寻找,但无法找到答案 解决我的问题。

我想做一个每小时的报告,我会得到这个查询

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:00到17:00在16小时内没有电话怎么办, 我会得到以下结果。

|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

请帮忙。

谢谢

1 个答案:

答案 0 :(得分: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)) - 计算所有行数,以便正常使用我将0更改为NULL。也可以更改为:SUM(IF(ce.datetime_init IS NULL,1,0))

  2. 使用LEFT JOIN table_name时,与指定表相关的所有条件表达式必须在LEFT JOIN ... ON子句下。如果它们位于WHERE之下,则有效地过滤所有具有NULL值的行(当call_center.call_entry表中不匹配时)。