Учитывая следующую таблицу в 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
ОБНОВИТЬ:
Для пояснения (как я уже сказал в комментариях) в реальном сценарии база данных должным образом нормализована . Эти столбцы «массива» находятся не в реальной таблице, а в результирующем наборе, который требуется в отчете. И новое требование состоит в том, что отчету также нужен столбец 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), это довольно элегантный вариант «выйти из тюрьмы». карта".