Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Неагрегатный MIN  [new]
SergASh
Member

Откуда:
Сообщений: 167
Привет всем.

Есть таблица, состоящая из n целочисленных колонок. Для каждой записи надо найти минимальное значение из этих n. Например, было
A1A2An
213
302010

А нужно
A1A2AnMIN
2131
30201010

Для маленьких n можно обойтись CASE'ом, но в моем случае их больше десятка. Есть какой-нибудь культурный способ это сделать?

Спасибо.

PS. SQL Server 2005
23 сен 09, 18:18    [7699560]     Ответить | Цитировать Сообщить модератору
 Re: Неагрегатный MIN  [new]
iljy
Member

Откуда:
Сообщений: 8711
SergASh,

сходу как-то так

select A1,A2,An,
(select min(x) from (select A1 x union all select A2 union all select An)t) MIN
from
(select 2 a1, 1 a2, 3 an
union all select 30,20,10)t
23 сен 09, 18:30    [7699610]     Ответить | Цитировать Сообщить модератору
 Re: Неагрегатный MIN  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iljy
SergASh,

сходу как-то так

select A1,A2,An,
(select min(x) from (select A1 x union all select A2 union all select An)t) MIN
from
(select 2 a1, 1 a2, 3 an
union all select 30,20,10)t
То же самое для SQL2008:
SQL2008
DECLARE @T TABLE(A1 INT,A2 INT,An INT);
INSERT @T(A1,A2,An)VALUES(2,1,3),(30,20,10);
SELECT A1,A2,An,(SELECT MIN(A)FROM(VALUES(A1),(A2),(An))T(A))[MIN]
FROM @T;
Без таблицы (как у iljy)
SQL2008
WITH CTE AS(SELECT * FROM(VALUES(2,1,3),(30,20,10))T(A1,A2,An))
SELECT A1,A2,An,(SELECT MIN(A)FROM(VALUES(A1),(A2),(An))T(A))[MIN]
FROM CTE;
23 сен 09, 20:36    [7700053]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить