Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите с запросом / 4 сообщений из 4, страница 1 из 1
01.02.2011, 12:22
    #37090306
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Весь день ломаю голову над, вроде бы, простой задачкой.
В таблице есть элементы: 1, 2, 3, 4... Обработка делает выборку элементов и печатает их по 4 штуки на лист. После печати пачка режется крест на крест и получившиеся стопки ставятся друг на друга. Как написать order by, чтобы в конечной стопке элементы располагались по порядку?

---------------------------------------------------------
IS NULL OR NOT IS NULL
...
Рейтинг: 0 / 0
01.02.2011, 16:38
    #37091271
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
BuryCommoner,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
with t(i) as 
  (values  1  union all select i+ 1  from t where i<NNN)
, l(n) as (select count( 1 ) from t)
select 
  t.i
, mod(t.i- 1 , l.n/ 4  + case mod(l.n,  4 ) when  0  then  0  else  1  end) list_no
from t, l
order by  2 ,  1 
NNN - кол-во записей.
Формулой в mod вычисляется номер листа для каждого id, по которому потом записи и сортируются.
На листе записи сортируются по id, в направлении увеличения которых и надо будет ставить стопки друг на друга.
...
Рейтинг: 0 / 0
02.02.2011, 05:02
    #37092131
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Спасибо, работает. Попадал на подобное решение, но оно показалось ошибочным из-за того, что при количестве элементов, не кратном четырем, на последних 2 листах они сбиваются в кучу. Тестил на 10 элементах и поэтому причину не выявил :) Придётся добивать пустыми до кратности.
...
Рейтинг: 0 / 0
02.02.2011, 09:51
    #37092289
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Теперь работает на любых количествах записей :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
with
	test(element) as (
		values  1 
		union all
		select element +  1 
		from test
		where element <  50 ) -- тестовые данные
	,src(element) as (select element from test where element <=  10 ) -- отбор элементов по условию
	,stat(cnt, cntmod4) as (select count(*), mod(count(*),  4 ) from src) -- количество строк
	,add(rn, element) as (
		values ( 0 , cast(null as int))
		union all
		select add.rn +  1 , cast(null as int)
		from add, stat
		where rn < case when stat.cntmod4 =  0  then  0  else ( 4  - stat.cntmod4) end) -- дополнение до кратности 4
	,algn(rn, element) as (
		select row_number() over(), element
		from (
			select element
			from src
			union all
			select element
			from add
			where rn >  0 
			order by element)) -- отбор, выравненный по 4 (сортировка элементов)
select algn.element
from algn, stat
order by mod(algn.rn -  1 , stat.cnt /  4  + case when stat.cntmod4 =  0  then  0  else  1  end), algn.rn

---------------------------------------------------------
IS NULL OR NOT IS NULL
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите с запросом / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]