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

Откуда:
Сообщений: 566
народ, наставьте на путь ...
Есть поле - ДАТА.
отсортировать по такой логике: если результат вычисления меньше 0 тогда в конец поля, если нет, тогда сортируем по результату вычисления и по дате.
declare @a int;
set @a = 8;
with c(f) as (
select 1 union all select 1 union all select 1 union all select 1)
, Q as (select dateadd(day,ROW_NUMBER() over(order by c.f), convert(varchar(10),GETDATE(),102)) as F 
		from c, c as c1, c as c2)

select *, DATEPART(MONTH, f)-@a
, ROW_NUMBER() over(order by case when @a-datepart(month, q.f) < 0 then 9999 else @a-DATEPART(MONTH, q.f) END)
from q
order by case when @a-datepart(month, q.f) < 0 then 9999 else @a-(DATEPART(MONTH, q.f)) END  
11 июн 13, 14:28    [14420747]     Ответить | Цитировать Сообщить модератору
 Re: order by + case  [new]
Glory
Member

Откуда:
Сообщений: 104760
Что за поле вы называете "результат вычисления " ?
11 июн 13, 14:30    [14420761]     Ответить | Цитировать Сообщить модератору
 Re: order by + case  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
Вопрос задан невнятно.
Но главный принцип, как мне кажется,
заключается в том, что значение NULL
ORDER BY рассматривает как наименьшее.
Это документировано.
11 июн 13, 14:36    [14420810]     Ответить | Цитировать Сообщить модератору
 Re: order by + case  [new]
_human
Member

Откуда:
Сообщений: 566
Glory
Что за поле вы называете "результат вычисления " ?

 @a-DATEPART(MONTH, q.f)

может немножко ошибся в коде..
declare @a int;
set @a = 8;
with c(f) as (
select 1 union all select 1 union all select 1 union all select 1)
, Q as (select dateadd(day,ROW_NUMBER() over(order by c.f), convert(varchar(10),GETDATE(),102)) as F 
		from c, c as c1, c as c2)

select *, @a-DATEPART(MONTH, q.f) as Field
, ROW_NUMBER() over(order by case when @a-datepart(month, q.f) < 0 then 9999 else @a-DATEPART(MONTH, q.f) END)
from q
order by case when @a-datepart(month, q.f) < 0 then 9999 else @a-(DATEPART(MONTH, q.f)) END  


iap
NULL
ORDER BY рассматривает как наименьшее.

да это я знаю, НО что делать что бы поместить "ненужные" записи в конец выборки ?
Согласно документации я могу из поместить в начало
case when @a-datepart(month, q.f) < 0 then NULL

вот..

попробовал сделать вот так
select *, @a-DATEPART(MONTH, q.f) as Field
, ROW_NUMBER() over(order by case when @a-datepart(month, q.f) < 0 then 9999 else @a-DATEPART(MONTH, q.f),q.f END)
from q
order by case when @a-datepart(month, q.f) < 0 then 9999 else @a-(DATEPART(MONTH, q.f)), q.f END

в итоге
Msg 102, Level 15, State 1, Line 9
Incorrect syntax near ','.


возможно решение
declare @a int;
set @a = 8;
with c(f) as (
select 1 union all select 1 union all select 1 union all select 1)
, Q as (select dateadd(day,ROW_NUMBER() over(order by c.f), convert(varchar(10),GETDATE(),102)) as F 
		from c, c as c1, c as c2)

select *, @a-DATEPART(MONTH, q.f) as Field
, ROW_NUMBER() over(order by case when @a-datepart(month, q.f) < 0 then 9999 else @a-DATEPART(MONTH, q.f) END,q.f)
from q
order by case when @a-datepart(month, q.f) < 0 then 9999 else @a-(DATEPART(MONTH, q.f)) END ,q.f

iap
Вопрос задан невнятно.

отсортировать по такой логике: если результат вычисления меньше 0 тогда в конец поля, если нет, тогда сортируем по результату вычисления и по дате.
11 июн 13, 17:34    [14422089]     Ответить | Цитировать Сообщить модератору
 Re: order by + case  [new]
Glory
Member

Откуда:
Сообщений: 104760
order by case when @a-datepart(month, q.f) < 0 then 9999 end, @a-(DATEPART(MONTH, q.f)), q.f
11 июн 13, 17:37    [14422102]     Ответить | Цитировать Сообщить модератору
 Re: order by + case  [new]
_human
Member

Откуда:
Сообщений: 566
Glory,
и еще вопрос =)
если у меня есть текстовое поле и нужно также, руководствуясь какой-то логикой, отправить в конец выборки часть записей. Как быть ?

with cte(f, k)as(select 'a', 'ok'
union
select 'b', 'ok'
union
select 'xx', 'ok'
union
select 'xff', 'ne_ok' )

select *, ROW_NUMBER() over(order by f) from cte
order by case when k = 'ne_ok' then 'XXXXXX' else f end


f	k	(No column name)
a ok 1
b ok 2
xx ok 4
xff ne_ok 3
11 июн 13, 17:50    [14422139]     Ответить | Цитировать Сообщить модератору
 Re: order by + case  [new]
Glory
Member

Откуда:
Сообщений: 104760
order by case when k = 'ne_ok' then 1 end, f

Вам же уже сказали, что NULL является наименьшим значением при упорядочивании
11 июн 13, 17:53    [14422150]     Ответить | Цитировать Сообщить модератору
 Re: order by + case  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
_human
iap
NULL
ORDER BY рассматривает как наименьшее.

да это я знаю, НО что делать что бы поместить "ненужные" записи в конец выборки ?
Согласно документации я могу из поместить в начало[src]
Написать функцию, которая из этих записей посчитает NULL, а потом отсортировать по убыванию?
11 июн 13, 21:14    [14422857]     Ответить | Цитировать Сообщить модератору
 Re: order by + case  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
iap
_human
пропущено...

да это я знаю, НО что делать что бы поместить "ненужные" записи в конец выборки ?
Согласно документации я могу из поместить в начало[src]
Написать функцию, которая из этих записей посчитает NULL, а потом отсортировать по убыванию?
Точнее не функцию, а просто выражение
11 июн 13, 21:21    [14422876]     Ответить | Цитировать Сообщить модератору
 Re: order by + case  [new]
hoha_ftf
Member

Откуда: ЕКБ
Сообщений: 42
_human
попробовал сделать вот так
select *, @a-DATEPART(MONTH, q.f) as Field
, ROW_NUMBER() over(order by case when @a-datepart(month, q.f) < 0 then 9999 else @a-DATEPART(MONTH, q.f),q.f END)
from q
order by case when @a-datepart(month, q.f) < 0 then 9999 else @a-(DATEPART(MONTH, q.f)), q.f END

в итоге
Msg 102, Level 15, State 1, Line 9
Incorrect syntax near ','.



в case потерялся end
и чтобы не сделать так:
select *, @a-DATEPART(MONTH, q.f) as Field
from q
order by case when @a-datepart(month, q.f) < 0 then 1 else 0 end, @a-(DATEPART(MONTH, q.f))
12 июн 13, 09:36    [14423871]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить