Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak obliczyć łączną liczbę godzin podróży między miastem x i y i na odwrót?

Pytanie

Pracujesz dla linii lotniczej i otrzymałeś zestaw danych o czasie podróży Pilota między miastami. Musisz określić wzajemność i znaleźć łączną liczbę godzin podróży między miastami. Oznacza to, że podróż pilota z miasta „1” do „2” i miasta „2” do „1” powinna być traktowana jako jedna, a następnie należy obliczyć całkowitą liczbę godzin podróży.

Napisz zapytanie SQL, aby uzyskać oczekiwany wynik.

Odpowiedz

Najpierw utwórzmy dane testowe.

--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

Aby osiągnąć pożądany rezultat, należy zamienić nazwy miast w rzędzie w określonej kolejności. Oznacza to, że możesz posortować nazwy from_city i to_city w wierszu w kolejności rosnącej lub malejącej, a następnie zachować pierwsze miasto jako city_1 a drugi jako city_2. Aby to zrobić, możesz użyć mniej niż < lub większe niż operator na from_city i to_city .

W ten sposób będziesz mógł zagregować travel_time_hours grupując city_1 i 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

To jest rozwiązanie, które wymyśliłem. Jeśli osiągnąłeś wynik w inny sposób, daj mi znać w komentarzach.

Zarejestruj się, aby otrzymywać te pytania do rozmowy kwalifikacyjnej bezpośrednio w swojej skrzynce odbiorczej.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Różne sposoby monitorowania zawsze włączonych grup dostępności programu SQL Server

  2. Wstawianie danych SQL Server do Salesforce za pomocą kursora

  3. Nowe zmiany w kolumnach zawierających tylko metadane w SQL Server 2016

  4. Samouczek dotyczący partycjonowania tabel SQL Server i partycji

  5. Co robi sp_reset_connection?