Как правильно подвести итог как & ldquo; Время болезни & ldquo; из другого стола - mysql

Я пишу C не Java, но это должно работать в любом случае. Я использую remote debug - определите «удаленное» соединение с LOCALHOST, которое позволяет указать пользователя, с которым вы будете подключаться, указать ROOT. Затем определите удаленное приложение в подключении конфигурации отладки: LOCALHOST. Обязательно проверьте «пропустить загрузку до целевого пути» в нижней части основной вкладки, а также в окне свойств подключения.

0
задан Prochu1991 19 March 2019 в 19:10
поделиться

1 ответ

1113 Это действительно ожидается. Вышеупомянутый запрос объединяет 4 таблицы:

  • order_status
  • болезнь
  • работники
  • приказы

"[ 1127] работники «таблица имеет отношение 1: N к« order_status ».

Также « работники » имеют отношение 1: N к болезни, на самом деле это не имеет значения, даже если это 1: 1 . [ 1115]

Запрос создает декартово произведение между вышеуказанными таблицами и дубликатов значений столбцов из каждой таблицы может быть в наборе результатов запроса выше.

Удалите group by и sum, чтобы увидеть набор результатов.

Например, в вашем примере для id_worker 25 у вас есть 3 строки order_status, соединенные с 1 строкой болезни (значения этой строки будут продублированы 3 раза), объединенные с 1 строкой рабочих (снова они будут продублированы 3 раза), с 1 заказами строка (такая же).

Таким образом, агрегатная функция sum объединяет повторяющиеся значения.

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

Чтобы решить эту проблему, используйте подзапросы для агрегирования результатов:

SELECT workers.fname, 
       workers.lname, 
       order_statusAgg.number_order,
       workers.id_worker,
       order_statusAgg.desc_order, 
       SEC_TO_TIME(SUM(order_statusAgg.stime)) AS 'TOTAL TIME', 
       SEC_TO_TIME(SUM(sicknessAgg.stime)) AS 'SICKNESS TIME' 
FROM   workers 
INNER JOIN (
SELECT sickness.id_worker, SUM((Time_to_sec(sickness.end_date) - 
                       Time_to_sec(sickness.begin_date))) AS stime
FROM sickness
GROUP BY sickness.id_worker
) sicknessAgg
               ON sicknessAgg.id_worker = workers.id_worker
       INNER JOIN (
SELECT order_status.id_worker, orders.number_order, orders.desc_order, SUM((Time_to_sec(order_status.end_date) - 
                       Time_to_sec(order_status.begin_date))) AS stime
FROM order_status
           INNER JOIN orders 
               ON orders.id_order = order_status.id_order
GROUP BY order_status.id_worker
) order_statusAgg
               ON workers.id_worker = order_statusAgg.id_worker 

WHERE  order_statusAgg.number_order LIKE 'TEST'
GROUP BY workers.id_worker

Обратите внимание, что в этом случае необходимо начинать с таблицы worker , так как вы хотите агрегировать различное количество строк из таблиц order_status и sickness.

Ссылки:

Как объединить три таблицы, чтобы получить Sum

MySQL JOIN с несколькими таблицами и SUMS

Как получить сумму двух таблиц, используя внутреннее объединение

0
ответ дан Jannes Botis 19 March 2019 в 19:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: