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

Откуда:
Сообщений: 61
Добрый день! Существует выборка:
Договор 1 01.01.2002 1
Договор 1 02.01.2002 2
Договор 1 03.01.2002 6
Договор 1 04.01.2002 4
Договор 1 05.01.2002 3
Договор 2 03.01.2002 1
Договор 2 04.01.2002 1
Договор 2 05.01.2002 2
Договор 2 05.01.2002 2
Договор 3 03.01.2002 2
Договор 3 04.01.2002 3
Договор 3 05.01.2002 4
Договор 3 05.01.2002 7
Договор 3 06.01.2002 3
Договор 3 07.01.2002 3

1 столбец - договор, второй - дата, третий значение.
Есть условие, что если значение у договора хоть раз было больше 5, то это плохой договор, если никогда не было то хороший. Необходимо разделить договора на хороший и плохой.

В общем хочу получить что-то типа
Договор 1 bad
Договор 2 good
Договор 3 bad


Возможно есть какой то более элегантный и не ресурсотребовательный запрос, без использования not in по всей выборке
13 мар 14, 14:45    [15717875]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с CASE  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
group by + max + case
13 мар 14, 14:46    [15717889]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с CASE  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
SELECT Contract
,ISNULL((SELECT TOP(1) 'bad' FROM T TT WHERE TT.Contract=T.Contract AND TT.V>5),'good')
FROM T;
13 мар 14, 14:50    [15717921]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с CASE  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
SELECT T.Contract, BadGood=ISNULL(TT.Bad,'good')
FROM T OUTER APPLY(SELECT TOP(1) 'bad' FROM T TT WHERE TT.Contract=T.Contract AND TT.V>5) TT(Bad);
13 мар 14, 14:53    [15717955]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с CASE  [new]
aleks2
Guest
iap
SELECT T.Contract, BadGood=ISNULL(TT.Bad,'good')
FROM T OUTER APPLY(SELECT TOP(1) 'bad' FROM T TT WHERE TT.Contract=T.Contract AND TT.V>5) TT(Bad);

Ты меня пугаешь

SELECT [договор], max([значение]), case when max([значение])>=5 then 'плохой' else 'хароший' end
   from [Существует выборка]
   group by [договор]
13 мар 14, 15:25    [15718269]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с CASE  [new]
CheaterX
Member

Откуда:
Сообщений: 61
aleks2, спасибо)) простейший вариант странно сразу в голову не пришел.
iap, с APPLY работает дольше чем с "not in", но все равно спасибо
13 мар 14, 15:37    [15718361]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с CASE  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
aleks2
Ты меня пугаешь
Красиво, правда?
13 мар 14, 15:45    [15718406]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с CASE  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
CheaterX
aleks2, спасибо)) простейший вариант странно сразу в голову не пришел.
iap, с APPLY работает дольше чем с "not in", но все равно спасибо
Где NOT IN?
Если NOT IN(SELECT ...), то не надо!
Только NOT EXISTS!
13 мар 14, 15:46    [15718415]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с CASE  [new]
CheaterX
Member

Откуда:
Сообщений: 61
iap, aleks2
Спасибо) А как выбрать только хорошие договора, которые никогда не были плохими?
13 мар 14, 16:07    [15718598]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с CASE  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1358
CheaterX,

Знак >= поменяй на <
14 мар 14, 07:46    [15721568]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с CASE  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1358
т.е. немного не так, having max(field) < 5
14 мар 14, 07:48    [15721570]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с CASE  [new]
CheaterX
Member

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

Спасибо)
14 мар 14, 13:06    [15723349]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить