Question
Vous travaillez pour une compagnie aérienne et vous avez reçu un ensemble de données sur le temps de trajet de Pilot entre les villes. Vous devez déterminer l'inverse et trouver le nombre total d'heures de trajet entre les villes. Cela signifie que le voyage du pilote de la ville '1' à '2' et de la ville '2' à '1' doit être considéré comme un, puis le total des heures de voyage doit être calculé.
Écrivez une requête SQL pour obtenir le résultat attendu.
Répondre
Créons d'abord les données de test.
--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
Pour obtenir le résultat souhaité, vous devez échanger les noms de ville dans la ligne en fonction d'un certain ordre. Cela signifie que vous pouvez trier les noms from_city et to_city dans une ligne par ordre croissant ou décroissant, puis conserver la première ville en tant que city_1
et l'autre comme city_2. Pour ce faire, vous pouvez utiliser moins de < ou supérieur à > opérateur sur from_city
et to_city
.
De cette façon, vous pourrez agréger les travel_time_hours
en regroupant city_1
et 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
C'est la solution que j'ai trouvé. Si vous avez obtenu le résultat d'une autre manière, faites-le moi savoir dans les commentaires.
Inscrivez-vous pour recevoir ces questions d'entretien directement dans votre boîte de réception.