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

Откуда: Санкт-Петербург
Сообщений: 348
Коллеги, подскажите как правильно прописать CASE

Мне нужно получить из выборки нечто вроде

CASE ? WHEN Поле1<=Поле2 THEN Поле1 ELSE Поле2 END

Вот на месте знака вопроса явно что-то просится. А вроде как по контексту вставить нечего.
Как сделать конструкцию рабочей? на текущий момент она не выдает искомый результат.
26 ноя 13, 17:11    [15193048]     Ответить | Цитировать Сообщить модератору
 Re: CASE  [new]
Glory
Member

Откуда:
Сообщений: 104751
MedBrat
Как сделать конструкцию рабочей?

Убрать знак вопроса "?"
26 ноя 13, 17:13    [15193063]     Ответить | Цитировать Сообщить модератору
 Re: CASE  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
Glory,

эм... спасибо. у меня в исходном коде его не было на самом деле. просто условие хитрое вышло, и выводилось не то, что ожидал. как часто бывает "спросил, подумал, сам решил"
26 ноя 13, 17:22    [15193143]     Ответить | Цитировать Сообщить модератору
 Re: CASE  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
всё таки нажать F1, ИМХО как-то быстрее чем набивать вопрос в форуме

Simple CASE expression:
CASE input_expression 
     WHEN when_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END 


Searched CASE expression:

CASE
     WHEN Boolean_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END
26 ноя 13, 17:24    [15193164]     Ответить | Цитировать Сообщить модератору
 Re: CASE  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
StarikNavy
всё таки нажать F1, ИМХО как-то быстрее чем набивать вопрос в форуме

Simple CASE expression:
CASE input_expression 
     WHEN when_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END 


Searched CASE expression:

CASE
     WHEN Boolean_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END


Спасибо, дело не F1. писать такое умею, но затупил.
26 ноя 13, 17:24    [15193173]     Ответить | Цитировать Сообщить модератору
 Re: CASE  [new]
iap
Member

Откуда: Москва
Сообщений: 47107
MedBrat
на текущий момент она не выдает искомый результат.
Могут быть ещё нюансы со значениями NULL
26 ноя 13, 19:17    [15193944]     Ответить | Цитировать Сообщить модератору
 Re: CASE  [new]
Azik23
Member

Откуда:
Сообщений: 11
iap
MedBrat
на текущий момент она не выдает искомый результат.
Могут быть ещё нюансы со значениями NULL


+1

MedBrat
Коллеги, подскажите как правильно прописать CASE

Мне нужно получить из выборки нечто вроде

CASE ? WHEN Поле1<=Поле2 THEN Поле1 ELSE Поле2 END

Вот на месте знака вопроса явно что-то просится. А вроде как по контексту вставить нечего.
Как сделать конструкцию рабочей? на текущий момент она не выдает искомый результат.


соответственно

CASE ? WHEN isnull(Поле1, <default>) <= isnull(Поле2, <default>) THEN Поле1 ELSE Поле2 END
26 ноя 13, 19:30    [15193992]     Ответить | Цитировать Сообщить модератору
 Re: CASE  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
Коллеги, есть вот такой нюанс.

SELECT TOP (10) ILE.[Entry No_], ILE.[Location Code], ILE.LocFirm, LOH.[Date of change], ILE.[Posting Date],
CASE WHEN LOH.[Date of change] <= ILE.[Posting Date] THEN
(SELECT TOP 1 MAX(LOH1.[Date of change])
FROM [585$Firm Change History for Loc] LOH1
GROUP BY [New Firm], LOH1.[Location Code]
HAVING MAX(LOH1.[Date of change]) <= ILE.[Posting Date] AND LOH1.[Location Code] = ILE.[Location Code]) END AS EXPR1
FROM [585$Item Ledger Entry] AS ILE INNER JOIN
[585$Firm Change History for Loc] AS LOH ON LOH.[Location Code] = ILE.[Location Code]
GROUP BY ILE.[Entry No_], ILE.[Location Code], ILE.LocFirm, LOH.[Date of change], ILE.[Posting Date], ILE.[Location Code]


В результате у меня по данному запросу отбирается 10 строк

Entry No_ Location Code LocFirm Date of change Posting Date EXPR1
104365895 55 2009-05-05 00:00:00.000 2012-01-01 00:00:00.000 2009-05-05 00:00:00.000
104365895 55 2010-08-01 00:00:00.000 2012-01-01 00:00:00.000 2009-05-05 00:00:00.000
104365895 55 2011-07-01 00:00:00.000 2012-01-01 00:00:00.000 2009-05-05 00:00:00.000
104383899 55 2009-05-05 00:00:00.000 2012-01-01 00:00:00.000 2009-05-05 00:00:00.000
104383899 55 2010-08-01 00:00:00.000 2012-01-01 00:00:00.000 2009-05-05 00:00:00.000
104383899 55 2011-07-01 00:00:00.000 2012-01-01 00:00:00.000 2009-05-05 00:00:00.000
104383900 55 2009-05-05 00:00:00.000 2012-01-01 00:00:00.000 2009-05-05 00:00:00.000
104383900 55 2010-08-01 00:00:00.000 2012-01-01 00:00:00.000 2009-05-05 00:00:00.000
104383900 55 2011-07-01 00:00:00.000 2012-01-01 00:00:00.000 2009-05-05 00:00:00.000
104383901 55 2009-05-05 00:00:00.000 2012-01-01 00:00:00.000 2009-05-05 00:00:00.000

Получил в желанном поле по кейсу красную фицру, но при этом максимальная дата зеленая. Хочу ее. В чем ошибка?
27 ноя 13, 14:44    [15199050]     Ответить | Цитировать Сообщить модератору
 Re: CASE  [new]
o-o
Guest
MedBrat,

>>>GROUP BY [New Firm], LOH1.[Location Code]

в подзапросе группируете по двум полям,
одно из них LOH1.[Location Code], коррелируется со внешим запросом, а [New Firm] -- нет.
потом, в этом подзапросе, ну пусть вернулось 100 строк для разных New Firm.
Вы взяли какой-то первый попавшийся MAX(LOH1.[Date of change]),
потому что к TOP-у нет ORDER BY
27 ноя 13, 15:05    [15199288]     Ответить | Цитировать Сообщить модератору
 Re: CASE  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
o-o
MedBrat,

>>>GROUP BY [New Firm], LOH1.[Location Code]

в подзапросе группируете по двум полям,
одно из них LOH1.[Location Code], коррелируется со внешим запросом, а [New Firm] -- нет.
потом, в этом подзапросе, ну пусть вернулось 100 строк для разных New Firm.
Вы взяли какой-то первый попавшийся MAX(LOH1.[Date of change]),
потому что к TOP-у нет ORDER BY


ГЛОБАЛЬНЫЙ РЕСПЕКТ!!!

Глаза в кучу, слона b не заприметил...
27 ноя 13, 15:19    [15199450]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить