2015-01-06 7 views
0

У меня есть запрос, который должен прочитать записи в таблице leave_requests_2014 и сделать sum() принятых запросов на отпуск всех записей для каждого работодателя!Группировка записей в запросе mysql дает ошибку

SELECT lr.emp_id employee, 
ifnull(MAX(CASE WHEN lr.leave_type =2 THEN (sum((TO_DAYS(lr.end_date) - TO_DAYS(lr.start_date)+1))) END) ,0) annual_leave, 
ifnull(MAX(CASE WHEN lr.leave_type =3 THEN (sum((TO_DAYS(lr.end_date) - TO_DAYS(lr.start_date)+1))) END),0) sick_leave 
FROM leave_requests_2014 lr 
WHERE lr.status =5 
GROUP BY lr.emp_id 

Запрос, который возвращает следующую ошибку:

#1111 - Invalid use of group function 

Я действительно не знаю, что должны быть сгруппированы, чтобы получить желаемый результат!

Пожалуйста, посмотрите на sqlfiddle Это результат я на самом деле нужно

employee annual_leave sick_leave 
    5    7    2 
    6    4    1 
+0

Это не работает, потому что вы положили функцию 'SUM()' в неположенное место. Переместите его вокруг 'IFNULL' и все, и запрос будет запущен. Я не могу сказать, приведет ли он к ожидаемым результатам. Пожалуйста, обновите вопрос с помощью определения таблицы, некоторых входных данных и результатов, которые вы хотите получить. – axiac

ответ

1

Функции «Group by», такие как MAX() и/или SUM() не могут быть выполнены рекурсивно в пределах одного и того же оператора. Решением было бы выполнить первое агрегирование в подзапросе. Например:

SELECT employee, 
ifnull(MAX(CASE WHEN leave_type =2 THEN annual_leave END),0) annual_leave, 
ifnull(MAX(CASE WHEN leave_type =3 THEN sick_leave END),0) sick_leave 
FROM 
    (
     SELECT lr.emp_id employee, lr.leave_type 
     (CASE WHEN lr.leave_type =2 THEN (sum((TO_DAYS(lr.end_date) - TO_DAYS(lr.start_date)+1))) END) annual_leave, 
     (CASE WHEN lr.leave_type =3 THEN (sum((TO_DAYS(lr.end_date) - TO_DAYS(lr.start_date)+1))) END) sick_leave 
     FROM leave_requests_2014 lr 
     WHERE lr.status =5 
     GROUP BY lr.emp_id, lr.leave_type 
    ) firstAggregation 
group by employee 
+0

Большое спасибо Серхио! Ты действительно помог! – goseo

1

Более простой (и правильно) версии вашего запроса:

SELECT lr.emp_id AS employee, 
    SUM(IF(lr.leave_type = 2, DATEDIFF(lr.end_date, lr.start_date) + 1, 0)) AS annual_leave, 
    SUM(IF(lr.leave_type = 3, DATEDIFF(lr.end_date, lr.start_date) + 1, 0)) AS sick_leave, 
FROM leave_requests_2014 lr 
WHERE lr.status = 5 
GROUP BY lr.emp_id 

Другой вариант, даже намного проще, что дает ежегодный отпуск и дни отпуска по болезни в разных рядах (при необходимости):

SELECT lr.emp_id AS employee, lr.leave_type, 
    SUM(DATEDIFF(lr.end_date, lr.start_date) + 1) AS leave_days, 
FROM leave_requests_2014 lr 
WHERE lr.status = 5 AND lr.leave_type IN (2, 3) 
GROUP BY lr.emp_id, lr.leave_type 

Это требует немного обработки кода клиента: проверьте значение leave_type, чтобы узнать, является ли значение в leave_days «year_leave» или «sick_leave». Используйте 0 для количества дней для другого типа отпуска, если он не возвращается по запросу

+0

Спасибо, аксиак, я действительно не хочу, чтобы количество листьев каждого из них приходилось в разных рядах! – goseo

+0

Вы попробовали первый запрос? – axiac

+0

Да, первый запрос действительно работает. спасибо +1 – goseo

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