MySQL группировка при использовании подзапроса - PullRequest
0 голосов
/ 22 июня 2019

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

Запрос выглядит так:

select c.name,
(select sum(duration) from dates d 
inner join time t1 on d.time_id=t1.id 
where d.employee=t.employee 
and d.date >= now() - INTERVAL 12 MONTH) as ad,    
(select sum(cost) from dates d 
inner join time t1 on d.time_id=t1.id 
where d.employee=t.employee 
and d.date >= now() - INTERVAL 12 MONTH) as ac

FROM time t

inner join employees ee on t.employee=ee.employee
inner join centres c on ee.centre=c.id 
where 
ee.centre in (4792,4804,4834) group by c.centre

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

Если я удаляю группу к тому времени, я получаю списоквсе записи, но затем они никак не суммируются, и мне нужно это сводное представление

1 Ответ

0 голосов
/ 22 июня 2019

Оператор 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
...