Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como calcular o total de horas de viagem entre a cidade x e y e vice-versa

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.