Pergunta
Você está trabalhando para uma companhia aérea e recebeu um conjunto de dados do tempo de viagem do Pilot entre as cidades. Você precisa determinar a recíproca e encontrar o total de horas de viagem entre as cidades. Isso significa que a viagem do piloto da cidade '1' para '2' e da cidade '2' para '1' deve ser considerada como uma e, em seguida, o total de horas de viagem deve ser calculado.
Escreva uma consulta SQL para obter a saída esperada.
Resposta
Vamos criar os dados de teste primeiro.
--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
Para alcançar o resultado desejado, você deve trocar os nomes das cidades dentro da linha com base em alguma ordem. Isso significa que você pode classificar os nomes from_city e to_city em uma linha em ordem crescente ou decrescente e, em seguida, manter a primeira cidade como
city_1
e o outro como cidade_2. Para fazer isso, você pode usar menos de < ou maior que > operador em from_city
e to_city
. Dessa forma, você poderá agregar as
travel_time_hours
agrupando city_1
e 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
Esta é a solução que eu encontrei. Se você conseguiu a saída de outra forma, deixe-me saber nos comentários.
Inscreva-se para receber essas perguntas da entrevista diretamente em sua caixa de entrada.