Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách tính tổng số giờ đi lại giữa thành phố x, y và ngược lại

Câu hỏi

Bạn đang làm việc cho một công ty hàng không và bạn đã nhận được tập dữ liệu về thời gian di chuyển giữa các thành phố của Phi công. Bạn cần xác định đối ứng và tìm tổng số giờ di chuyển giữa các thành phố. Điều đó có nghĩa là, hành trình của phi công từ thành phố '1' đến '2' và thành phố '2' đến '1' phải được coi là một và sau đó tổng số giờ di chuyển phải được tính toán.

Viết một truy vấn SQL để đạt được kết quả mong đợi.

Trả lời

Hãy để chúng tôi tạo dữ liệu thử nghiệm trước.

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

Để đạt được kết quả mong muốn, bạn nên hoán đổi tên thành phố trong hàng dựa trên một số thứ tự. Điều đó có nghĩa là, bạn có thể sắp xếp tên from_city và to_city trong một hàng theo thứ tự tăng dần hoặc giảm dần rồi giữ thành phố đầu tiên là city_1 và cái còn lại là thành phố_2. Để làm điều này, bạn có thể sử dụng ít hơn < hoặc lớn hơn > toán tử trên from_cityto_city .

Bằng cách này, bạn sẽ có thể tổng hợp travel_time_hours bằng cách nhóm city_1city_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

Đây là giải pháp mà tôi đã nghĩ ra. Nếu bạn đã đạt được kết quả theo cách khác, hãy cho tôi biết trong phần nhận xét.

Đăng ký để nhận những câu hỏi phỏng vấn này trực tiếp trong hộp thư đến của bạn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để cải thiện hiệu suất cho tính năng lọc ngày giờ trong SQL Server?

  2. Giao diện mạng SQL, lỗi:50 - Đã xảy ra lỗi Thời gian chạy cơ sở dữ liệu cục bộ. Không thể tạo phiên bản tự động

  3. SQL Server kiểm tra phân biệt chữ hoa chữ thường?

  4. Spotlight Cloud hỗ trợ cho Azure SQL DB Thông báo (Xem trước)

  5. Cách kiểm tra cài đặt ANSI_NULLS của phiên trong SQL Server