Это довольно сложно, поэтому убедитесь, что вы делаете это шаг за шагом. В этом помогут пункты WITH
.
Шаги
- Найдите поездки из Лондона и в Лондон в июне 2020 года. Вы можете использовать
IN
или EXISTS
, чтобы узнать, - Группируйте путешествия по Лондону по путешественникам, учитывайте поездки и поездки в результате несчастных случаев и оставляйте только тех путешественников, которые совершили более одного путешествия.
- Возьмите этот набор результатов, чтобы подсчитать путешественников и подвести итог
Запрос
with london_travels as
(
select
traveller_id,
case when tt_id in
(select parent_event_id from trucker_traffic where event_type = 'accident')
then 1 else 0 end as accident
from trucker_traffic tt
where event_type = 'travel'
and month(tt.date) = 6
and year(tt.date) = 2020
and exists
(
select
from trucker_places tp
where tp.coordinate in (tt.starting_point_coordinate, tt.destination_coordinate)
and tp.city = 'London'
)
)
, london_travellers as
(
select
traveller_id,
count(*) as travels,
sum(accident) as accident_travels
from london_travels
group by traveller_id
having count(*) > 1;
)
select
count(*) as total_travellers,
sum(travels) as total_travels,
sum(accident_travels) as total_accident_travels
from london_travellers;
Если ваша версия MySQL не поддерживает предложения WITH
, вы, конечно, можете просто вложить запросы. Т.е.
with a as (...), b as (... from a) select * from b;
становится
select * from (... from (...) a) b;
Вы говорите в заголовке запроса, что не хотите GROUP BY
в запросе. Это возможно, но усложняет запрос. Если вы хотите это сделать, я оставляю это вам как задачу. Подсказка: вы можете выбрать путешественников и посчитать их в подзапросах на каждого путешественника.