2013-09-30 6 views
1

У меня есть только один столбец в моей таблице, имеющие все различные значения мне нужно сгруппировать ее в пар 3 и сделать 3 колонки из 3-х рядов, пожалуйста, помогитеколонка грести только один столбец

Источник

COL1 
----- 
A 
B 
C 
D 
E 
F 

Требуемая мощность 1:

COL1 
------ 
A,B,C 
D,E,F 

Требуемая мощность 2:

col1 col2 col3 
---- ---- ---- 
A  B  C 
D  E  F 
+1

Какую версию Oracle вы используете? (Выход 1 очень прост с 11.2, намного сложнее с предыдущими версиями) –

+0

, а если таблица имеет только пять строк? означает A, B, C, D и E? –

+0

нет, это точно не будет –

ответ

1

Выход 1:

select listagg(col1, ',') within group (order by col1) as col 
from (
    select col1, 
     case 
      when row_number() over (order by col1) <= (count(*) over())/2 then 0 
      else 1 
     end as grp 
    from foo 
) 
group by grp 
order by grp; 

Для выхода 2:

select max(col1) as col1, 
     max(col2) as col2, 
     max(col3) as col3 
from (
    select case mod(row_number() over (order by col1),3) 
      when 1 then col1 
      else null 
     end as col1, 
     case mod(row_number() over (order by col1),3) 
      when 2 then col1 
      else null 
     end as col2,   
     case mod(row_number() over (order by col1),3) 
      when 0 then col1 
      else null 
     end as col3, 
     case 
      when row_number() over (order by col1) <= (count(*) over())/2 then 0 
      else 1 
     end as grp 
    from foo 
) 
group by grp 
order by grp; 

SQLFiddle пример: http://sqlfiddle.com/#!4/d699c/1

+0

Спасибо, вы можете сделать вывод 2? –

+0

@ user2698972: количество столбцов должно быть жестко запрограммировано числом операторов case (по крайней мере, я не вижу лучшего способа). Количество строк можно «обобщить», скорректировав сравнение для столбца «grp» –

1

Пожалуйста, попробуйте ниже запрос для второго решения:

select Col1, Col2, Col3 From(
    select 
    ceil(row_number() over(order by Col1)/3) Rnum, 
    mod(row_number() over(order by Col1)+2, 3)+1 Row_Num, 
    COl1 
    from 
    YourTable 
)x pivot (min(Col1) for Row_Num in ('1' as Col1, '2' as Col2, '3' as Col3)); 

Fiddle Demo

0

Другой способ (будет работать для каждого кратного 3 записей)

output1

select listagg(col1, ',') within group (order by col1) col1 
from 
(select col1, row_number() over(order by col1) rn 
from t) tt 
group by rn - decode(mod (rn, 3) ,0,3,mod (rn, 3)); 

output2

select c2_col col1, c3_col col2, c1_col col3 
from 
(select rn - decode(mod (rn, 3) ,0,3,mod (rn, 3)) grp, mod(rn, 3) rnm, col1 
from 
(select col1, row_number() over(order by col1) rn 
from t)) tt 
pivot 
(
    max(col1) as col 
    for rnm in (0 as c1,1 c2,2 c3) 
); 

Here is a sqlfiddle demo

Смежные вопросы