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_city
và to_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_1
và 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
Đâ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.