Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come calcolare le ore di viaggio totali tra le città xey e viceversa

Domanda

Lavori per una compagnia aerea e hai ricevuto un set di dati sul tempo di viaggio di Pilot tra le città. È necessario determinare il reciproco e trovare le ore di viaggio totali tra le città. Ciò significa che il viaggio del pilota dalla città da "1" a "2" e da "2" a "1" deve essere considerato come uno e quindi deve essere calcolato il totale delle ore di viaggio.

Scrivi una query SQL per ottenere l'output previsto.

Rispondi

Creiamo prima i dati del 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

Per ottenere il risultato desiderato, dovresti scambiare i nomi delle città all'interno della riga in base a un ordine. Ciò significa che puoi ordinare i nomi from_city e to_city in una riga in ordine crescente o decrescente e quindi mantenere la prima città come city_1 e l'altro come città_2. Per fare ciò, puoi utilizzare meno di < o maggiore di > operatore su from_city e to_city .

In questo modo potrai aggregare le travel_time_hours raggruppando 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

Questa è la soluzione che ho trovato. Se hai ottenuto l'output in altro modo, fammelo sapere nei commenti.

Iscriviti per ricevere queste domande del colloquio direttamente nella tua casella di posta.