Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да изчислим общите часове за пътуване между град x и y и обратно

Въпрос

Работите за авиокомпания и сте получили набор от данни за времето за пътуване на пилота между градовете. Трябва да определите реципрочната стойност и да намерите общите часове за пътуване между градовете. Това означава, че пътуването на пилота от град „1“ до „2“ и град „2“ до „1“ трябва да се счита за едно и след това трябва да се изчислят общите часове на пътуване.

Напишете SQL заявка, за да постигнете очаквания резултат.

Отговор

Нека първо създадем тестовите данни.

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

За да постигнете желания резултат, трябва да размените имената на градовете в реда въз основа на някакъв ред. Това означава, че можете да сортирате имената from_city и to_city в ред във възходящ или низходящ ред и след това да запазите първия град като city_1 а другият като град_2. За да направите това, можете да използвате по-малко от < или по-голямо от > оператор на from_city и to_city .

По този начин ще можете да обобщите travel_time_hours чрез групиране city_1 и 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

Това е решението, което измислих. Ако сте постигнали резултата по друг начин, уведомете ме в коментарите.

Регистрирайте се, за да получавате тези въпроси за интервю директно във входящата си кутия.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 7645 Нулев или празен предикат на пълен текст

  2. Има ли разлика между SQL Server Express (2012) и LocalDB?

  3. SQL Server рекурсивно самостоятелно присъединяване

  4. Преобразувайте името на месеца в номер на месеца в SQL Server

  5. Как да присвоя резултат от exec на sql променлива?