powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Счет записей по значениями внутри group by
4 сообщений из 4, страница 1 из 1
Счет записей по значениями внутри group by
    #39385221
_Алхимик_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ситуация следующая. Есть таблица оценки качества обслуживания оператора qos с полями:

calldate - Дата/время звонка
client_num - Номер телефона клиента
operator_num - Внутренний номер оператора
score - Оценка

Оценка может быть от 1 до 5

Фрагмент (пример) таблицы:
calldateclient_numoperator_numscore2017-01-12 15:07:0189991234571134152017-01-12 15:13:1289991234572134132017-01-12 15:57:2089991234573134262017-01-12 16:00:238999123457413415
Также есть запрос, который считает кол-во оценок и среднюю оценку по операторам за определенный период
Код: sql
1.
2.
3.
4.
5.
6.
7.
select
	operator_num,
	count(score) cnt_score,
	avg(score) avg_score
from qos
where calldate between '2017-01-12 12:00:00' and '2017-01-12 17:00:00'
group by operator_num



Запрос работает и возвращает

operator_numcnt_scoreavg_score134134.3333134216.0000

Дополнительно нужно посчитать кол-во каждой оценки
Например, оператор 1341, единицу поставили 0 раз, двойку - 0 раз, тройку - 1 раз, четверку - 0 раз, пятерку - 2 раза.

Хочется сделать вот такой запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
	queue_num,
	count(score) cnt_score,
	avg(score) avg_score,
	(select count(score) from dual where score = 1) cnt_1,
	(select count(score) from dual where score = 2) cnt_2,
	(select count(score) from dual where score = 3) cnt_3,
	(select count(score) from dual where score = 4) cnt_4,
	(select count(score) from dual where score = 5) cnt_5
from qos
where calldate between '2017-01-12 12:00:00' and '2017-01-12 17:00:00'
group by operator_num


Давно работал с oracle и помню, что такая конструкция там работала. Но в Mysql cnt_1..cnt_5 возвращает какую-то чушь.

operator_numcnt_scoreavg_scorecnt_1cnt_2cnt_3cnt_4cnt_5134134.3333NULLNULLNULLNULL3134216.0000NULLNULLNULLNULLNULL

Вопрос к знатокам, должен ли такой запрос работать в mysql или я что-то делаю не так?


Версия MySQL:
Код: plaintext
1.
Server version: 5.1.73 Source distribution
...
Рейтинг: 0 / 0
Счет записей по значениями внутри group by
    #39385227
_Алхимик_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поправка, оценки могут быть от 1 до 7, но не в этом суть

Вот так работает

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
	q.operator_num,
	count(q.score) cnt_score,
	avg(q.score) avg_score,
	(select count(score) from qos where score = 1 and calldate between '2017-01-12 12:00:00' and '2017-01-12 17:00:00' and operator_num = q.operator_num) cnt_1,
	(select count(score) from qos where score = 2 and calldate between '2017-01-12 12:00:00' and '2017-01-12 17:00:00' and operator_num = q.operator_num) cnt_2,
	(select count(score) from qos where score = 3 and calldate between '2017-01-12 12:00:00' and '2017-01-12 17:00:00' and operator_num = q.operator_num) cnt_3,
	(select count(score) from qos where score = 4 and calldate between '2017-01-12 12:00:00' and '2017-01-12 17:00:00' and operator_num = q.operator_num) cnt_4,
	(select count(score) from qos where score = 5 and calldate between '2017-01-12 12:00:00' and '2017-01-12 17:00:00' and operator_num = q.operator_num) cnt_5
from qos q
where q.calldate between '2017-01-12 12:00:00' and '2017-01-12 17:00:00'
group by q.operator_num;



operator_numcnt_scoreavg_scorecnt_1cnt_2cnt_3cnt_4cnt_5cnt_6cnt_7134134.33330010200134216.00000000010

Но плодить подзапросы не хочется, и сам запрос выглядит не очень

Можно ли всё-таки в такой ситуации использовать dual ?
...
Рейтинг: 0 / 0
Счет записей по значениями внутри group by
    #39385231
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
	queue_num,
	count(score) cnt_score,
	avg(score) avg_score,
	sum(score = 1) cnt_1,
	sum(score = 2) cnt_2,
	sum(score = 3) cnt_3,
	sum(score = 4) cnt_4,
	sum(score = 5) cnt_5
from qos
where calldate between '2017-01-12 12:00:00' and '2017-01-12 17:00:00'
group by operator_num


Чуток магии приведения типа bool к int и sum по логическому условию делает то что нужно.
Если подходить строго, то sum(if(score = 1, 1, 0)) или sum(case when score = 1 then 1 else 0 end)
...
Рейтинг: 0 / 0
Счет записей по значениями внутри group by
    #39385242
_Алхимик_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То что надо! Спасибо!
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Счет записей по значениями внутри group by
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]