Враховуючи таку таблицю в 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, і він працює, хоча і трохи громіздко. Це також складніше, ніж зазначено у відповідях, оскільки вам потрібно враховувати той факт, що в одному рядку є два значення 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), це досить елегантне "вийти з в'язниці" картка ".