Оператор SQL, который возвращает неожиданный результат, - это не так уж и много.
Без спецификации, наглядно проиллюстрированной примерами данных и ожидаемым результатом, мы просто предполагаем результатчто запрос должен быть достигнут.
Я думаю, что суть проблемы - значение t.employee
, возвращаемое для GROUP BY
, несколько строк подробностей с различными значениями для t.employee
сворачиваютсяв одну строку для каждого значения c.centre
, а значение t.employee
из "некоторой строки" в наборе.(Нестандартное расширение, специфичное для MySQL, позволяет запускать запрос без выдачи ошибки, тогда как другие СУБД выдают ошибку. Мы можем сделать поведение MySQL более совместимым со стандартом, включив ONLY_FULL_GROUP_BY
в `sql_mode. Но это простозаставьте SQL в вопросе выдать ошибку.)
Рекомендуемое исправление (просто предположение) - вывести ac
и ad
для каждого сотрудника, перед выполнением GROUP BY
, а затем агрегировать.
(Я все еще подозреваю, что присоединения к centre
не включены в подзапросы. Является ли employee
первичным ключом или уникальным ключом в employees
? Функционально ли зависит centre
отemployee
? Так много вопросов, слишком много предположений.
Я предполагаю, что мы после результата, возвращенного запросом, примерно так:
SELECT c.name
, SUM(v.ad) AS `ad`
, SUM(v.ac) AS `ac`
FROM ( -- derive `ad` and `ac` in an inline view before we collapse rows
SELECT ee.employee
, ee.centre
, ( -- derived for each employee
SELECT SUM(d1.duration)
FROM time t1
JOIN dates d1
ON d1.time_id = t1.id
AND d1.date >= NOW() + INTERVAL -12 MONTH
WHERE d1.employee = t.employee
) AS `ad`
, ( -- derived for each employee
SELECT SUM(d2.cost)
FROM time t2
JOIN dates d2
ON d2.time_id = t2.id
AND d2.date >= NOW() + INTERVAL -12 MONTH
WHERE d2.employee = t.employee
) AS `ac`
FROM time t
JOIN employees ee
ON ee.employee = t.employee
WHERE ee.centre in (4792,4804,4834)
GROUP
BY ee.employee
, ee.centre
) v
LEFT
JOIN centres c
ON c.id = v.centre
GROUP
BY v.centre
, c.name