Учитывая следующую таблицу в SQL Server 2005:
ID Col1 Col2 Col3
-- ---- ---- ----
1 3 34 76
2 32 976 24
3 7 235 3
4 245 1 792
Каков наилучший способ написать запрос, который дает следующий результат (то есть тот, который дает последний столбец - столбец, содержащий значения minium из Col1, Col2 и Col 3 для каждой строки)?
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
UPDATE:
Для пояснения (как я уже сказал в комментариях) в реальном сценарии база данных правильно нормирована. Эти столбцы "массива" не находятся в фактической таблице, а находятся в результирующем наборе, который требуется в отчете. И новое требование состоит в том, что отчет также нуждается в этом столбце MinValue. Я не могу изменить базовый набор результатов, и поэтому я искал T-SQL для удобного "выхода из тюремной карты".
Я попробовал подход CASE, упомянутый ниже, и он работает, хотя он немного громоздкий. Это также сложнее, чем указано в ответах, потому что вам нужно учитывать тот факт, что в одной строке есть два значения min.
В любом случае, я думал, что опубликую свое текущее решение, которое, учитывая мои ограничения, работает очень хорошо. Он использует оператора 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
Я скажу заранее, что я не ожидаю, что это обеспечит лучшую производительность, но с учетом обстоятельств (я не могу перепроектировать все запросы только для нового требования столбца MinValue), это довольно элегантный "get из тюремной карты".