Как суммировать математический результат из двух таблиц в MySQL

Не уверен, что делать!

Использование MySQL

Мне нужно отобразить общее количество поездок в час для определенного идентификатора оператора

Таким образом, общее количество поездок в час для идентификатора оператора «2» должно отображаться где-то как число «7». Это число «7» является суммой TripsPerHour.

SELECT S.routeid, S.operatorid, R.routeid, S.percentage * R.frequency/100 AS TripsPerHour 
  FROM route_split S, routes R 
 WHERE R.routeid = S.routeid
   AND S.operatorid ='2';
+---------+------------+---------+--------------+
| routeid | operatorid | routeid | TripsPerHour |
+---------+------------+---------+--------------+
|       6 |          2 |       6 |       1.0000 |
|      12 |          2 |      12 |       4.0000 |
|      13 |          2 |      13 |       2.0000 |
+---------+------------+---------+--------------+
3 rows in set (0.00 sec)

Лучше уточнить, с какой базой данных SQL вы работаете, так как их синтаксис может различаться.

e_i_pi 10.12.2020 22:45
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
1
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам просто нужна агрегация SUM() вместе с пунктом GROUP BY

SELECT S.operatorid, R.routeid, 
       SUM(S.percentage * R.frequency/100) AS TripsPerHour 
  FROM route_split S
  JOIN routes R 
    ON R.routeid = S.routeid
 GROUP BY S.operatorid, R.routeid

Если вам нужно только значение с operatorid=2, добавьте

WHERE S.operatorid = 2

перед GROUP BY например

SELECT R.routeid, 
       SUM(S.percentage * R.frequency/100) AS TripsPerHour 
  FROM route_split S
  JOIN routes R 
    ON R.routeid = S.routeid
 WHERE S.operatorid = 2
 GROUP BY R.routeid

Обновление: вы можете добавить функцию окна SUM() OVER () при условии, что ваша версия БД 8.0+, например

SELECT S.operatorid, R.routeid,
       SUM(S.percentage * R.frequency/100) OVER () AS Total_TripsPerHour 
  FROM route_split S
  JOIN routes R 
    ON R.routeid = S.routeid
 WHERE S.operatorid = 2

Спасибо за комментарий, мне нужно иметь сумму TripsPerHour в качестве отдельного вывода.

rowan333 10.12.2020 22:42

Пожалуйста, @rowan333, не могли бы вы уточнить, что вы имеете в виду, редактируя вопрос, пожалуйста?

Barbaros Özhan 10.12.2020 22:43

хорошо, какая версия MySQL DB @rowan333?

Barbaros Özhan 10.12.2020 22:57

8.0.22 это версия

rowan333 10.12.2020 23:07

хорошо, тогда вы можете использовать оконную функцию, как я упоминал в ответе @ rowan333

Barbaros Özhan 10.12.2020 23:08

Я получаю эту ошибку: ОШИБКА 1055 (42000): Выражение № 3 списка SELECT не находится в предложении GROUP BY и содержит неагрегированный столбец 'bus_network.S.percentage', который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode=only_full_group_by

rowan333 10.12.2020 23:10

ну, нам нужно удалить GROUP BY в этом случае @rowan333

Barbaros Özhan 10.12.2020 23:13

Отлично! Спасибо за вашу помощь. Это именно то, что мне было нужно :)

rowan333 10.12.2020 23:16

Вы также можете использовать опцию WITH ROLLUP, чтобы получить общую сумму в виде отдельной строки:

         SELECT  S.operatorid, R.routeid, 
       SUM(S.percentage * R.frequency/100) AS TripsPerHour ) FROM
  route_split S JOIN routes R 
    ON R.routeid = S.routeid GROUP BY S.operatorid, R.routeid WITH ROLLUP

Какой бы ответ вы ни выбрали, сделайте для него ОБЪЯСНЕНИЕ, прежде чем запускать его в производство.

Другие вопросы по теме