Использование SUM из одного запроса в другом запросе MySQL - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть два запроса, которые я пытаюсь использовать вместе.

Запрос 1 создает таблицу данных из таблицы заработной платы.В таблице заработной платы может быть несколько записей для одного человека в один и тот же день.Таким образом, если 'hours_type' совпадает, я хочу, чтобы часы добавлялись вместе, прежде чем этот запрос даст результаты.

SELECT   `payroll`.*, `personnel`.`assigned_shift`
FROM     `payroll`, `personnel` 
WHERE    `payroll`.`full_name`= `personnel`.`full_name` 
     AND `payroll`.`date` = '$f_date' 
     AND `personnel`.`assigned_shift` IN ('A', 'B', 'C') 
ORDER BY `personnel`.`assigned_shift` ASC;

Запрос 2 добавит hours вместе для дублирующихся записей, которые имеют full_name и hours_type тот же самый.Результаты этого запроса - это то, что я хочу использовать в запросе № 1 для дубликатов записей.

SELECT   *, SUM(`hours`) AS `hours` 
FROM     `payroll` 
GROUP BY `full_name`, `hours_type`

Я пробовал Union, Union All (узнал, что ни одна из этих работ не работает, так как количество столбцов по некоторым причинам отличается.) Я не совсем понимаю, как работают подзапросы, хотя я пробовал несколько попыток подзапроса.Любая помощь будет принята с благодарностью.(Я новичок в SQL).

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Спасибо GMB за ответ.

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

SELECT `payroll`.*, `personnel`.`assigned_shift`, SUM(`hours`) AS `hours`
FROM `payroll`
INNER JOIN `personnel` ON `payroll`.`full_name` = `personnel`.`full_name`
WHERE `date` = '$f_date' AND `personnel`.`assigned_shift` IN ('A', 'B', 'C')
GROUP BY `full_name`, `hours_type`
ORDER BY `personnel`.`assigned_shift`, `personnel`.`l_name`

Извините за обратные тики, кажется, MariaDB требует их.

0 голосов
/ 03 февраля 2019

Я подозреваю, что ваши два запроса могут быть объединены следующим образом:

SELECT
    pe.full_name,
    pa.hours_type,
    SUM(hours) hours
FROM 
    personel pe
    LEFT JOIN payroll pa ON pa.full_name = pe.full_name AND pa.date = '$f_date'
WHERE
    pe.assigned_shift IN ('A', 'B', 'C') 
GROUP BY 
    pe.full_name,
    pa.hours_type
ORDER BY p.assigned_shift

Запрос объединяет записи таблицы personel с таблицей payroll и агрегирует результаты по количеству сотрудников.имя и тип часов, а также общее количество часов.

Для персонала без заработной платы в этот день будет отображаться запись с пустыми столбцами hours_type и hours.Чтобы не отображать эти записи, вы можете переключить LEFT JOIN на INNER JOIN.

Вы можете адаптировать список неагрегированных полей (pe.full_name, 'pa.hours_type) по своему желанию;каждое неагрегированное поле также должно присутствовать в предложении GROUP BY.

Замечания к вашему SQL-коду:

  • всегда использовать явные объединения вместо неявных объединений
  • избегайте использования обратных галочек, если в этом нет особой необходимости: они затрудняют чтение запроса
  • , используют псевдонимы таблиц для сокращения запроса
  • избегают SELECT *: будьте внимательны к столбцам, которые вы хотите выбрать
  • в не древних версиях MySQL все неагрегированные столбцы должны появляться в предложении GROUP BY (обратите внимание, что это не очень хорошо работает с SELECT *).
...