Cho bảng sau trong SQL Server 2005:
ID Col1 Col2 Col3
-- ---- ---- ----
1 3 34 76
2 32 976 24
3 7 235 3
4 245 1 792
Cách tốt nhất để viết truy vấn mang lại kết quả sau (tức là một truy vấn cho ra cột cuối cùng - cột chứa các giá trị nhỏ nhất trong số Col1, Col2 và Col 3 cho mỗi hàng )?
ID Col1 Col2 Col3 TheMin
-- ---- ---- ---- ------
1 3 34 76 3
2 32 976 24 24
3 7 235 3 3
4 245 1 792 1
CẬP NHẬT:
Để làm rõ (như tôi đã nói trong coments) trong kịch bản thực, cơ sở dữ liệu được chuẩn hóa đúng cách . Các cột "mảng" này không nằm trong bảng thực tế nhưng nằm trong tập hợp kết quả được yêu cầu trong báo cáo. Và yêu cầu mới là báo cáo cũng cần có cột MinValue này. Tôi không thể thay đổi tập kết quả cơ bản và do đó tôi đã tìm đến T-SQL để có "thẻ thoát khỏi nhà tù" tiện dụng.
Tôi đã thử cách tiếp cận CASE được đề cập bên dưới và nó hoạt động, mặc dù nó hơi rườm rà. Nó cũng phức tạp hơn được nêu trong các câu trả lời vì bạn cần giải thích cho thực tế là có hai giá trị nhỏ nhất trong cùng một hàng.
Dù sao, tôi nghĩ rằng tôi sẽ đăng giải pháp hiện tại của mình, giải pháp này, với những hạn chế của tôi, hoạt động khá tốt. Nó sử dụng toán tử UNPIVOT:
with cte (ID, Col1, Col2, Col3)
as
(
select ID, Col1, Col2, Col3
from TestTable
)
select cte.ID, Col1, Col2, Col3, TheMin from cte
join
(
select
ID, min(Amount) as TheMin
from
cte
UNPIVOT (Amount for AmountCol in (Col1, Col2, Col3)) as unpvt
group by ID
) as minValues
on cte.ID = minValues.ID
Tôi sẽ nói thẳng rằng tôi không mong đợi điều này sẽ mang lại hiệu suất tốt nhất, nhưng trong hoàn cảnh (tôi không thể thiết kế lại tất cả các truy vấn chỉ cho yêu cầu cột MinValue mới), đó là một cách khá thanh lịch "thoát khỏi tù Thẻ".