Добрый день! Помогите, пожалуйста, оптимизировать запрос. Нужно сделать выборку с интервалом по часу например, из таблицы со звонками телефонными по времени. Вот как-то делать неправильно и некрасиво..
SELECT
SUM(call_result = 10 and entire_call = 1 and time(dt_tm) between '04:00%' and '05:00%') AS Принятые_4-5,
SUM(call_result = 10 and entire_call = 1 and time(dt_tm) between '05:00%' and '06:00%') AS Принятые_5-6,
SUM(call_result = 10 and entire_call = 1 and time(dt_tm) between '07:00%' and '08:00%') AS Принятые_7-8,
SUM(call_result = 8 and time(dt_tm) between '04:00%' and '05:00%') AS Пропущенные_4-5,
SUM(call_result = 8 and time(dt_tm) between '04:00%' and '05:00%') AS Пропущенные_5-6
FROM BD
where (num ='1234' or num = '5678')
and dt_tm BETWEEN '2017-11-20%' AND '2017-12-02%';
Я так понимаю, что надо подсчитать кол-во звонков за каждый час?
Как бы я делал:
SELECT
COUNT(num)
FROM
BD
WHERE
(num ='1234' OR num = '5678') AND
(dt_tm BETWEEN '2017-11-20%' AND '2017-12-02%)
GROUP BY
CONCAT(EXTRACT(YEAR FROM dt_tm), ...);
Я не стал расписывать условие
CONCAT(EXTRACT(YEAR FROM dt_tm), ...);
Ты можешь это сделать самостоятельно (просто придется по помощи по mysql поползать чуть-чуть)
Основная цель этого условия превратить твою dt_tm в некоторую конструкцию, которая будет уникальна для всех времен с точностью до часу, например
ГОД МЕСЯЦ ДЕНЬ ЧАС
P.S.
все таки влез в помощь :)
CONCAT_WS(EXTRACT(YEAR FROM dt_tm), EXTRACT(YEAR FROM dt_tm), EXTRACT(MONTH FROM dt_tm), EXTRACT(DAY FROM dt_tm), EXTRACT(HOUR FROM dt_tm))
В итоге для текущего времени написания этого ответа будет сформирована строка
2017 11 29 13
P.P.S.
Возможно стоит написать так
SELECT
IFNULL(COUNT(num), 0) AS count
Проверил - COUNT всегда выдаёт число, поэтому IFNULL не требуется, таким образом
SELECT
COUNT(num) AS count
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости