Въпрос
Работите за авиокомпания и сте получили набор от данни за времето за пътуване на пилота между градовете. Трябва да определите реципрочната стойност и да намерите общите часове за пътуване между градовете. Това означава, че пътуването на пилота от град „1“ до „2“ и град „2“ до „1“ трябва да се счита за едно и след това трябва да се изчислят общите часове на пътуване.
Напишете SQL заявка, за да постигнете очаквания резултат.
Отговор
Нека първо създадем тестовите данни.
--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
За да постигнете желания резултат, трябва да размените имената на градовете в реда въз основа на някакъв ред. Това означава, че можете да сортирате имената from_city и to_city в ред във възходящ или низходящ ред и след това да запазите първия град като city_1
а другият като град_2. За да направите това, можете да използвате по-малко от < или по-голямо от > оператор на from_city
и to_city
.
По този начин ще можете да обобщите travel_time_hours
чрез групиране city_1
и 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
Това е решението, което измислих. Ако сте постигнали резултата по друг начин, уведомете ме в коментарите.
Регистрирайте се, за да получавате тези въпроси за интервю директно във входящата си кутия.