powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / разбить данные
7 сообщений из 7, страница 1 из 1
разбить данные
    #39481988
darKKK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть данные

Код: 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.
28.
29.
30.
31.
32.
33.
FF                                        DD
----------------------------------------- --------------------------------------------
x1                                        test1
x2                                        test2
x3                                        test3
x4                                        test4
x5                                        test5
x6                                        test6
x7                                        test7
x8                                        test8
x9                                        test9
x10                                       test10
x11                                       test11
x12                                       test12
x13                                       test13
x14                                       test14
x15                                       test15
x16                                       test16
x17                                       test17
x18                                       test18
x19                                       test19
x20                                       test20
x21                                       test21
x22                                       test22
x23                                       test23
x24                                       test24
x25                                       test25
x26                                       test26
x27                                       test27
x28                                       test28
x29                                       test29
x30                                       test30
 
30 rows selected

надо их разбить на 3 колонки

FF_1 DD_1 FF_2 DD_2 FF_3 DD_3x1 test1 x11 test11 x21 test21x2 test2 x12 test12 x22 test22x3 test3 x13 test13 x23 test23x4 test4 x14 test14 x24 test24x5 test5 x15 test15 x25 test25x6 test6 x16 test16 x26 test26x7 test7 x17 test17 x27 test27x8 test8 x18 test18 x28 test28x9 test9 x19 test19 x29 test29x10 test10 x30 test20 x30 test30

3 это константа
если записей не кратно 3, то добить NULLами

какие есть варианты ?

union all/case слишком громоздко выходит
а pivot я тут не осилил (не уверен вообще, можно ли так им)
...
Рейтинг: 0 / 0
разбить данные
    #39481999
darKKKpivot я тут не осилилразворачивание строк в столбцы это и есть пивот.
...
Рейтинг: 0 / 0
разбить данные
    #39482000
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pivot))
...
Рейтинг: 0 / 0
разбить данные
    #39482001
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
darKKK
union all/case слишком громоздко выходит

Union all обычно увеличивает количество строк, тебе же на до их уменьшить.
Скорее group by
...
Рейтинг: 0 / 0
разбить данные
    #39482022
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
darKKK,

Код: plsql
1.
2.
3.
4.
5.
6.
with t(ff, dd) as (select 'x'||rownum, 'test'||rownum from dual connect by rownum <= 31)
, t0 as (select t.*, replace(dd,'test') tmp, ceil(count(*) over ()/3) rr from t)
select *
from (select ff, dd, trunc((tmp-1)/rr)+1 x, mod(tmp-1,rr)+1 y from t0)
pivot (max(ff) ff, max(dd) as dd for (x) in (1 x1,2 x2,3 x3))
order by 1;



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
         Y X1_FF      X1_DD      X2_FF      X2_DD      X3_FF      X3_DD     
---------- ---------- ---------- ---------- ---------- ---------- ----------
         1 x1         test1      x12        test12     x23        test23    
         2 x2         test2      x13        test13     x24        test24    
         3 x3         test3      x14        test14     x25        test25    
         4 x4         test4      x15        test15     x26        test26    
         5 x5         test5      x16        test16     x27        test27    
         6 x6         test6      x17        test17     x28        test28    
         7 x7         test7      x18        test18     x29        test29    
         8 x8         test8      x19        test19     x30        test30    
         9 x9         test9      x20        test20     x31        test31    
        10 x10        test10     x21        test21                          
        11 x11        test11     x22        test22                          

11 rows selected.

Вся хитрость в том, что "матрица" заполняется по столбцам а не по строкам.
Как вариант, можно еще нумеровать через аналитическую функцию ntile.

Если бы заполнение было по столбцам - в аналитике необходимости не было бы.
...
Рейтинг: 0 / 0
разбить данные
    #39482028
dbms_photoshopнумеровать через аналитическую функцию ntileа аргумент ntile задавать через аналитический count/3?
...
Рейтинг: 0 / 0
разбить данные
    #39482037
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не слишком ли?а аргумент ntile задавать через аналитический count/3?Зачем? Правда есть другая проблемка.
Код: plsql
1.
2.
3.
4.
5.
6.
with t(ff, dd) as (select 'x'||rownum, 'test'||rownum from dual connect by rownum <= 31)
, t0 as (select t.*, to_number(replace(dd,'test')) tmp, ceil(count(*) over ()/3) rr from t)
select *
from (select ff, dd, ntile(3) over (order by tmp) x, mod(tmp-1,rr)+1 y from t0)
pivot (max(ff) ff, max(dd) as dd for (x) in (1 x1,2 x2,3 x3))
order by 1;



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
         Y X1_FF      X1_DD      X2_FF      X2_DD      X3_FF      X3_DD     
---------- ---------- ---------- ---------- ---------- ---------- ----------
         1 x1         test1      x12        test12     x23        test23    
         2 x2         test2      x13        test13     x24        test24    
         3 x3         test3      x14        test14     x25        test25    
         4 x4         test4      x15        test15     x26        test26    
         5 x5         test5      x16        test16     x27        test27    
         6 x6         test6      x17        test17     x28        test28    
         7 x7         test7      x18        test18     x29        test29    
         8 x8         test8      x19        test19     x30        test30    
         9 x9         test9      x20        test20     x31        test31    
        10 x10        test10     x21        test21                          
        11 x11        test11                           x22        test22    

11 rows selected.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / разбить данные
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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