2013-07-20 2 views
0

У меня возникли проблемы с подзапросом и некоторой группировкой. Подзапрос выбирает из всей таблицы, а не только отдельных групп ... мой кодMySQL - группировка с подзапросом

SELECT SEC_TO_TIME(TIME_TO_SEC(call_start) - TIME_TO_SEC(call_start)%(30*60)) AS intervals, 
     COUNT(*) AS OFFERED, 
     SUM(agent_duration) AS AGENT_SUM, 
     SUM(TIME_TO_SEC(TIMEDIFF(dequeue_time, enqueue_time))) AS ANS_TIME_SUM, 
     COUNT(DISTINCT agent_username) AS UNIQUE_AGENTS, 
     (SELECT COUNT(*) FROM call_detail 
     WHERE TIME_TO_SEC(TIMEDIFF(dequeue_time, enqueue_time)) < 40) AS SLA, 
     SUM(queue_duration) AS TOTAL_QUEUE_TIME 
FROM call_detail 
WHERE DATE(call_start) = CURDATE() 
GROUP BY intervals 

Моя цель состоит в том, чтобы иметь, что подзапрос просто возвращает количество записей, где этот результат TimeDiff меньше, чем 40 в том, что особенно Интервал

Спасибо.

ответ

1

Я не думаю, что для этого вам нужен подзапрос. Вобще условное агрегацию:

SELECT SEC_TO_TIME(TIME_TO_SEC(call_start) - TIME_TO_SEC(call_start)%(30*60)) AS intervals, 
     COUNT(*) AS OFFERED, 
     SUM(agent_duration) AS AGENT_SUM, 
     SUM(TIME_TO_SEC(TIMEDIFF(dequeue_time, enqueue_time))) AS ANS_TIME_SUM, 
     COUNT(DISTINCT agent_username) AS UNIQUE_AGENTS, 
     sum(case when TIME_TO_SEC(TIMEDIFF(dequeue_time, enqueue_time)) < 40 then 1 else 0 end) as SLA, 
     SUM(queue_duration) AS TOTAL_QUEUE_TIME 
FROM call_detail 
WHERE DATE(call_start) = CURDATE() 
GROUP BY intervals; 

Вы бы использовать подзапрос, чтобы получить в общей сложности более все записи, а не те, которые пострадали от пункта where или group by.

+0

+1 Я собирался опубликовать ответ, который объединяется с подзапросом, который сгруппирован, и другое решение с использованием коррелированного подзапроса, но мне это нравится лучше. – Barmar

+0

Спасибо, ребята ... Я проверю это и опубликую свои результаты – CameronS

+0

Да. Так оно и было. Очень ценю быстрый ответ. – CameronS

Смежные вопросы