Pytanie
Pracujesz dla linii lotniczej i otrzymałeś zestaw danych o czasie podróży Pilota między miastami. Musisz określić wzajemność i znaleźć łączną liczbę godzin podróży między miastami. Oznacza to, że podróż pilota z miasta „1” do „2” i miasta „2” do „1” powinna być traktowana jako jedna, a następnie należy obliczyć całkowitą liczbę godzin podróży.
Napisz zapytanie SQL, aby uzyskać oczekiwany wynik.
Odpowiedz
Najpierw utwórzmy dane testowe.
--create test data
USE demo;
CREATE TABLE dbo.travel_detail (
id int identity(1,1),
from_city varchar(100),
to_city varchar(100),
travel_time_hours smallint
)
GO
INSERT INTO dbo.travel_detail values
('Oslo','Helsinki',125),
('Helsinki','Oslo',110),
('Stockholm','Oslo',132),
('Oslo','Stockholm',180),
('Copenhagen','Helsinki',148),
('Helsinki','Copenhagen',84),
('Stockholm','Copenhagen',116),
('Helsinki','Stockholm',124)
GO
SELECT * FROM dbo.travel_detail
--clean up
--USE demo;
--DROP TABLE dbo.travel_detail
Aby osiągnąć pożądany rezultat, należy zamienić nazwy miast w rzędzie w określonej kolejności. Oznacza to, że możesz posortować nazwy from_city i to_city w wierszu w kolejności rosnącej lub malejącej, a następnie zachować pierwsze miasto jako city_1
a drugi jako city_2. Aby to zrobić, możesz użyć mniej niż < lub większe niż operator na from_city
i to_city
.
W ten sposób będziesz mógł zagregować travel_time_hours
grupując city_1
i city_2
.
--solution
USE demo;
select
city_1,
city_2,
total_travel_hours = sum(travel_time_hours)
from (
select
city_1 = case when from_city < to_city then from_city else to_city end,
city_2 = case when from_city > to_city then from_city else to_city end,
travel_time_hours
from dbo.travel_detail
)x
group by city_1, city_2
order by city_1, city_2
To jest rozwiązanie, które wymyśliłem. Jeśli osiągnąłeś wynik w inny sposób, daj mi znać w komentarzach.
Zarejestruj się, aby otrzymywać te pytania do rozmowy kwalifikacyjnej bezpośrednio w swojej skrzynce odbiorczej.