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