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

Откуда: Ставрополь
Сообщений: 294
Всем привет.
есть своеобразная задача:
имеем некую таблицу(выборку)
STR
AAA
BBB
CCC
DDD

надо через каждые две строчки вставлять две пустые(это для разработки отчета-бланка, с двумя формами на лист и двусторонней печатью).
Делаю вот так(просьба ногами не бить):
with tbl as (select 'AAA' str from dual
         union select 'BBB' from dual
         union select 'CCC' from dual
         union select 'DDD' from dual)
select rownum rn
       ,case mod(rownum,2) 
             when 0 then rownum 
             else lead(rownum) over (order by rownum) end rn2
       , str 
from tbl
     union
select rownum rn
       ,case mod(rownum,2) 
             when 0 then rownum 
             else lead(rownum) over (order by rownum) end rn2
        , null 
from tbl
order by rn2,str
вроде все отлично, но если число записей нечетно, то надо к результату добавить в конце еще две пустые строчки, что бы пропечатывалась обратная сторона страницы.
Надеюсь понятно объяснил :).
Хочется решить проблему именно запросом(спортивный интерес), т.к. есть варианты решения с помощью PL/SQL и средствами BI Publisher.
1 апр 11, 10:59    [10455620]     Ответить | Цитировать Сообщить модератору
 Re: запрос с добавлением пустых строк  [new]
-2-
Member

Откуда:
Сообщений: 15330
with tbl as (select 'AAA' str from dual
         union select 'BBB' from dual
         union select 'CCC' from dual
         union select 'CCD' from dual
         union select 'DDD' from dual)
select nvl2(r.rn, null, str) str
from 
(select row_number() over(order by str) rn, count(*) over() cn, tbl.*  from tbl) l
left join (select 0 rn from dual union all select 0 from dual union all select null from dual) r
   on mod(l.rn,2) = 0 or l.rn=l.cn
order by l.rn, r.rn nulls first;

STR 
--- 
AAA 
BBB 
    
    
CCC 
CCD 
    
    
DDD 
    
    

 11 rows selected 
1 апр 11, 11:13    [10455726]     Ответить | Цитировать Сообщить модератору
 Re: запрос с добавлением пустых строк  [new]
Anton_Demin
Member

Откуда: Ставрополь
Сообщений: 294
-2-
Спасибо, то что надо.
1 апр 11, 11:42    [10455944]     Ответить | Цитировать Сообщить модератору
 Re: запрос с добавлением пустых строк  [new]
-2-
Member

Откуда:
Сообщений: 15330
Еще вариантец без явной сортировки, правда повторным обращением к таблице:
select case when grouping_id(1,2) = 0 then str end str
from tbl
group by str, rollup(1,2)
having grouping_id(1,2) = 0 or mod(max(rownum), 2) = 0 or max(rownum) = (select count(*) from tbl)
;
1 апр 11, 12:16    [10456228]     Ответить | Цитировать Сообщить модератору
 Re: запрос с добавлением пустых строк  [new]
Flok
Member

Откуда:
Сообщений: 258
Еще вариант:

with 
tbl as  (select 'AAA' str from dual
         union select 'BBB' from dual
         union select 'CCC' from dual
         union select 'DDD' from dual),
tbl_2 as (select str, rownum rn from tbl),
tbl_count as (select count(*) total from tbl),
t_p as   (select rownum rn 
          from dual connect by level <= ( select total * 2 + decode(mod(total,2),1,1,0) from tbl_count))
select
(select str from tbl_2 where t_p.rn = tbl_2.rn + trunc((tbl_2.rn-1)/2)*2 )
from t_p
1 апр 11, 16:47    [10458405]     Ответить | Цитировать Сообщить модератору
 Re: запрос с добавлением пустых строк  [new]
parkan4k
Member

Откуда:
Сообщений: 32
Мой вариант с model

with t as(
select 'aaa' a from dual
union
select 'bbb' from dual
union
select 'ccc' from dual
union
select 'ddd' from dual
union
select 'eee' from dual
)
select a from(
select a, ceil((row_number()over(order by a))/2)b from t)f
model
partition by (b)
dimension by (row_number() over (partition by b order by a)r)
measures (a)
rules(
a[3]='',
a[4]=''
)
10 апр 11, 18:02    [10497850]     Ответить | Цитировать Сообщить модератору
 Re: запрос с добавлением пустых строк  [new]
AmKad
Member

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

Красиво.
10 апр 11, 18:16    [10497897]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить