我想做一个每小时的报告,我会得到这个查询
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
请帮忙。
谢谢
答案 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
您的查询错误:
COUNT(IF(ce.datetime_init IS NULL,1,0))
- 计算所有行数,以便正常使用我将0
更改为NULL
。也可以更改为:SUM(IF(ce.datetime_init IS NULL,1,0))
使用LEFT JOIN table_name
时,与指定表相关的所有条件表达式必须在LEFT JOIN ... ON
子句下。如果它们位于WHERE
之下,则有效地过滤所有具有NULL值的行(当call_center.call_entry表中不匹配时)。