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

Откуда:
Сообщений: 22
Имеется выборка со столбцом Position (постоет при помощи Row_Number для сортировки по адресам Город, Улица, Дом)
|Position |
----------
|1 |
|2 |
|3 |
|4 |
|5 |
|6 |
|7 |
|8 |
|9 |
|.... |
|300 |
Число записей может меняться и соответственно последнее значение Position будет равно числу записей.

Нужно выбрать записи в таком порядке 1, 151, 2, 152, 3, 153, 4, 154 ... , ...
Т.е. первая запись остается первой, а второй является запись ровно из середины выборки и так далее. Данная выборка будет производится в FastReport для формирования и печати адресных карточек (всего около 9000 адресов). Данный порядок нужен потому, что карточки будут формироваться по порядку на листах А4, каждая из которых будет занимать ровно половину листа (формат А5).
Как можно реализовать такую выборку средствами SQL Server или может FastReport? Заранее спасибо.
29 янв 13, 20:34    [13847246]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи в определенной мной последовательности  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
with x(n) as
(
 select 1 union all
 select 2 union all
 select 3 union all
 select 4 union all
 select 5 union all
 select 6 union all
 select 7 union all
 select 8
)
select
 n
from
 x
order by
 isnull(nullif(n % (max(n) over () / 2), 0), 2147483647), n;
29 янв 13, 21:09    [13847402]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи в определенной мной последовательности  [new]
Jenstel
Member

Откуда:
Сообщений: 22
invm
(
 select 1 union all
 select 2 union all
 select 3 union all
 select 4 union all
 select 5 union all
 select 6 union all
 select 7 union all
 select 8
)


Это вручную писать? Число записей может меняться и доходить до 9000
Можно подробнее описать Ваш пост? Особенно строку
order by
 isnull(nullif(n % (max(n) over () / 2), 0), 2147483647), n;
29 янв 13, 21:12    [13847420]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи в определенной мной последовательности  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
маленькая поправочка для нечетного количества
with x(n) as
(
   select top(51) number from master..spt_values where type='P' and number>0
)
select
 n
from
 x
order by
 isnull(nullif(n % ((max(n) over ()+1) / 2), 0), 2147483647), n;
29 янв 13, 21:23    [13847446]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи в определенной мной последовательности  [new]
Jenstel
Member

Откуда:
Сообщений: 22
Cygapb-007
маленькая поправочка для нечетного количества
with x(n) as
(
   select top(51) number from master..spt_values where type='P' and number>0
)
select
 n
from
 x
order by
 isnull(nullif(n % ((max(n) over ()+1) / 2), 0), 2147483647), n;


С этим разобрался. А если в выборке имеется еще и поле Format со значением 0 или 1, то как вывести сначала записи с Format=0 в таком порядке, а потом с Format=1 в обычном порядке?
29 янв 13, 22:00    [13847529]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи в определенной мной последовательности  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
Вообще, в общем случае можно обойтись и без Position, если он не нужен в отчете:
order by
 isnull(nullif(row_number() over (<выражение, определяющее Position>) % ((count(*) over () + 1) / 2), 0), 2147483647), row_number() over (<выражение, определяющее Position>);
А еще лучше задействовать многоколоночность в отчете.
29 янв 13, 22:22    [13847609]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи в определенной мной последовательности  [new]
Jenstel
Member

Откуда:
Сообщений: 22
invm
Вообще, в общем случае можно обойтись и без Position, если он не нужен в отчете:
order by
 isnull(nullif(row_number() over (<выражение, определяющее Position>) % ((count(*) over () + 1) / 2), 0), 2147483647), row_number() over (<выражение, определяющее Position>);
А еще лучше задействовать многоколоночность в отчете.


Position нужна для сортировки по адресу, чтобы улицы и дома шли по порядку
Format определяет те строки, которые в отчет попадут на отдельные страницы, а значит не подвергнутся резке и должны быть упорядочены по Position (по адресам)
29 янв 13, 23:21    [13847838]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи в определенной мной последовательности  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
Jenstel
А если в выборке имеется еще и поле Format со значением 0 или 1, то как вывести сначала записи с Format=0 в таком порядке, а потом с Format=1 в обычном порядке?
with x(n, format) as
(
 select 1, 0 union all
 select 2, 0 union all
 select 3, 0 union all
 select 4, 0 union all
 select 5, 0 union all
 select 6, 1 union all
 select 7, 1 union all
 select 8, 1
)
select
 n
from
 x
order by
 format,
 case when format = 0 then
  isnull(nullif(row_number() over (partition by format order by n) % ((count(*) over (partition by format) + 1) / 2), 0), 2147483647)
 end,
 row_number() over (partition by format order by n);
29 янв 13, 23:46    [13847902]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать записи в определенной мной последовательности  [new]
aleks2
Guest
invm
Jenstel
А если в выборке имеется еще и поле Format со значением 0 или 1, то как вывести сначала записи с Format=0 в таком порядке, а потом с Format=1 в обычном порядке?
with x(n, format) as
(
 select 1, 0 union all
 select 2, 0 union all
 select 3, 0 union all
 select 4, 0 union all
 select 5, 0 union all
 select 6, 1 union all
 select 7, 1 union all
 select 8, 1
)
select
 n
from
 x
order by
 format,
 case when format = 0 then
  isnull(nullif(row_number() over (partition by format order by n) % ((count(*) over (partition by format) + 1) / 2), 0), 2147483647)
 end,
 row_number() over (partition by format order by n);

Охренеть... как загибают.
with x(n) as
(
 select 1 union all
 select 2 union all
 select 3 union all
 select 4 union all
 select 5 union all
 select 6 union all
 select 7 union all
 select 151 union all
 select 152 union all
 select 153 union all
 select 154 union all
 select 155 union all
 select 156
)
select
 n
from
 x
order by
  case when n>=151 then 2*(n - 150)+1 else 2*(n) end 
30 янв 13, 06:11    [13848358]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить