sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo calcular el total de horas de viaje entre la ciudad x e y y viceversa

Pregunta

Está trabajando para una compañía aérea y ha recibido un conjunto de datos del tiempo de viaje de Pilot entre ciudades. Debe determinar el recíproco y encontrar el total de horas de viaje entre ciudades. Eso significa que el viaje del piloto de la ciudad '1' a la '2' y de la ciudad '2' a la '1' se debe considerar como uno y luego se debe calcular el total de horas de viaje.

Escriba una consulta SQL para lograr el resultado esperado.

Responder

Primero vamos a crear los datos de prueba.

--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 lograr el resultado deseado, debe intercambiar los nombres de las ciudades dentro de la fila según algún orden. Eso significa que puede ordenar los nombres from_city y to_city en una fila en orden ascendente o descendente y luego mantener la primera ciudad como city_1 y el otro como city_2. Para hacer esto, puede usar menos de < o mayor que > operador en from_city y to_city .

De esta manera, podrá agregar las travel_time_hours agrupando city_1 y 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 es la solución que he encontrado. Si ha logrado el resultado de otra manera, hágamelo saber en los comentarios.

Regístrese para recibir estas preguntas de la entrevista directamente en su bandeja de entrada.