Подсчитать средние значение по условиям. SQL
мне надо подсчитать значения по каждому дню:
- общее кол-во записей
- записи, где disposition = "ANSWERED"
- ср. значение duration, где dcontext != "queue-callback"
- ср. значение duration
- ср. значение duration, где dcontext = "queue-callback"
Вот запрос:
SELECT
datenew,
calls,
accepted,
AVG(without_callback),
AVG(all_calls),
AVG(only_callback)
FROM
(
SELECT
DATE_FORMAT(c1.calldate, '%Y-%m-%d') as datenew,
COUNT(1) as calls,
SUM(IF(c1.disposition = "ANSWERED", 1, 0)) as accepted,
SUM(IF(c1.dcontext != "queue-callback", c1.duration , 0)) as without_callback,
SUM(c1.duration) as all_calls,
SUM(IF(c1.dcontext = "queue-callback", c1.duration , 0)) as only_callback
FROM
asteriskcdrdb.cdr c1
WHERE
LEFT(c1.lastdata, 3) in ('601', '602') AND
DATE_FORMAT(c1.calldate, '%Y-%m-%d') BETWEEN "2020-04-28" AND "2020-05-01"
GROUP BY
DATE_FORMAT(c1.calldate, '%Y-%m-%d')
) as tmp
GROUP BY datenew
UPD: Проблема в том, что общее кол-во записей не подсчитывается, а так же не подсчитывает среднее значения по колонкам (выводит только сумму)
Ответы (1 шт):
Автор решения: Akina
→ Ссылка
По-моему, так:
SELECT
-- дата
DATE(c1.calldate) as datenew,
-- всего звонков
COUNT(1) as calls,
-- отвеченных
SUM(c1.disposition = "ANSWERED") as accepted,
-- среднее для всех, кроме queue-callback
AVG(CASE WHEN c1.dcontext != "queue-callback" THEN c1.duration END) as without_callback,
-- среднее для всех
AVG(c1.duration) as all_calls,
-- среднее для queue-callback
AVG(CASE WHEN c1.dcontext = "queue-callback" THEN c1.duration END) as only_callback
FROM asteriskcdrdb.cdr c1
WHERE LEFT(c1.lastdata, 3) in ('601', '602')
AND DATE(c1.calldate) BETWEEN "2020-04-28" AND "2020-05-01"
GROUP BY datenew;