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

Откуда:
Сообщений: 376
есть таблица

flag name
0 ivanov
0 petrov
0 sidorov
1 muhin
1 kisin

нужно вывести запросом (или не запросом)

ivanov muhin
petrov kisin
sidorov null

помогите люди добрые
2 ноя 10, 14:45    [9718843]     Ответить | Цитировать Сообщить модератору
 Re: Две поля в четыре  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
и зря!
гораздо лучше было бы
ivanov kisin
petrov null
sidorov muhin
2 ноя 10, 14:49    [9718888]     Ответить | Цитировать Сообщить модератору
 Re: Две поля в четыре  [new]
Акак
Guest
А как можно узнать, что к иавнову надо прицепить мухина, а не кисина например?
Или тупо по порядку следования?
2 ноя 10, 14:50    [9718898]     Ответить | Цитировать Сообщить модератору
 Re: Две поля в четыре  [new]
Georgiy L.
Member

Откуда:
Сообщений: 376
скажем так, отсортируем по алфавиту, с флагом ноль поставим в левое поле, с флагом 1 в правое
2 ноя 10, 14:52    [9718926]     Ответить | Цитировать Сообщить модератору
 Re: Две поля в четыре  [new]
AmKad
Member

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

11.2
with s as(
select 0 xz, 'ivanov'  name from dual union all
select 0 xz, 'petrov'  name from dual union all
select 0 xz, 'sidorov' name from dual union all
select 1 xz, 'muhin'   name from dual union all
select 1 xz, 'kisin'   name from dual)
select listagg(name, ' ') within group (order by xz) nm
from
 (select s.*,
  row_number() over (partition by xz order by name) rn
  from s
 )
 group by rn
2 ноя 10, 14:55    [9718962]     Ответить | Цитировать Сообщить модератору
 Re: Две поля в четыре  [new]
GL
Member

Откуда: Харьков
Сообщений: 1513
Georgiy L.,

with t as (
  select 0 flag, 'ivanov' name from dual union all
  select 0, 'petrov' from dual union all
  select 0, 'sidorov' from dual union all
  select 1, 'muhin' from dual union all
  select 1, 'kisin' from dual
)
select t1.name, t2.name
from (select rownum rn, name from t where flag=0) t1
 full outer join (select rownum rn, name from t where flag=1) t2
   on t2.rn=t1.rn
2 ноя 10, 14:57    [9718980]     Ответить | Цитировать Сообщить модератору
 Re: Две поля в четыре  [new]
Georgiy L.
Member

Откуда:
Сообщений: 376
а у меня оракл девятка :)
2 ноя 10, 14:57    [9718985]     Ответить | Цитировать Сообщить модератору
 Re: Две поля в четыре  [new]
rank в помощь ?
Guest
Georgiy L.

помогите люди добрые


Так не покатит ?

with tab as (
select 0 as flag, 'ivanov' as name from dual
union select 0 as flag, 'petrov' as name from dual
union select 0 as flag, 'sidorov' as name from dual
union select 1 as flag, 'muhin' as name from dual
union select 1 as flag, 'kisin' as name from dual)
select t1.name, t2.name from 
(select rank() over(order by name) rank,  t1.flag, t1.name from tab t1 where t1.flag=0 order by 2) t1
left outer join
(select  rank() over(order by name) rank, t2.flag, t2.name from tab t2 where t2.flag=1 order by 2) t2
on t1.rank=t2.rank
2 ноя 10, 15:02    [9719025]     Ответить | Цитировать Сообщить модератору
 Re: Две поля в четыре  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
Georgiy L.
а у меня оракл девятка :)


with t
as
(
    select 1 a, 'aaa' b from dual union all
    select 1 a, 'bbb' b from dual union all
    select 1 a, 'ccc' b from dual union all
    select 2 a, 'ddd' b from dual union all
    select 2 a, 'ttt' b from dual --union all               
)
select min(b) keep (dense_rank first order by a) || ' ' || max(b) keep (dense_rank last order by a)
from
(
    select t.*,
           row_number() over (partition by a order by a) rn
    from t
) a
group by rn

?
2 ноя 10, 15:05    [9719053]     Ответить | Цитировать Сообщить модератору
 Re: Две поля в четыре  [new]
rank в помощь ?
Guest
rank в помощь ?,

GL опередил..
2 ноя 10, 15:06    [9719060]     Ответить | Цитировать Сообщить модератору
 Re: Две поля в четыре  [new]
Georgiy L.
Member

Откуда:
Сообщений: 376
GL
Georgiy L.,

with t as (
  select 0 flag, 'ivanov' name from dual union all
  select 0, 'petrov' from dual union all
  select 0, 'sidorov' from dual union all
  select 1, 'muhin' from dual union all
  select 1, 'kisin' from dual
)
select t1.name, t2.name
from (select rownum rn, name from t where flag=0) t1
 full outer join (select rownum rn, name from t where flag=1) t2
   on t2.rn=t1.rn


Вот это помогло! Спасибо!
Наверное и другие варианты неплохие, но мне и этот пойдет!
2 ноя 10, 15:06    [9719061]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить