powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Нужна помощь в развороте таблицы
14 сообщений из 14, страница 1 из 1
Нужна помощь в развороте таблицы
    #39362548
rotation_table
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеем пример набора данных и 11-й оракл, т.е. можно использовать pivot.

Набор данных
Код: plsql
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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
select 'M11' id_m, 'T1' id_t, 111 cnt,10.11 price,11.11 price2,12.11 price3 from dual
union
select 'M11' id_m, 'T3' id_t, 311 cnt,20.11 price,21.11 price2,22.11 price3 from dual
union
select 'M11' id_m, 'T3' id_t, 311 cnt,30.11 price,31.11 price2,32.11 price3 from dual
union
select 'M11' id_m, 'T4' id_t, 411 cnt,40.11 price,41.11 price2,42.11 price3 from dual
union
select 'M11' id_m, 'T5' id_t, 511 cnt,50.11 price,51.11 price2,52.11 price3 from dual

union

select 'M12' id_m, 'T1' id_t, 112 cnt,10.12 price,11.12 price2,12.12 price3 from dual
union                                                                      
select 'M12' id_m, 'T3' id_t, 312 cnt,20.12 price,21.12 price2,22.12 price3 from dual
union                                                                      
select 'M12' id_m, 'T3' id_t, 312 cnt,30.12 price,31.12 price2,32.12 price3 from dual
union                                                                      
select 'M12' id_m, 'T4' id_t, 412 cnt,40.12 price,41.12 price2,42.12 price3 from dual
union                                                                      
select 'M12' id_m, 'T5' id_t, 512 cnt,50.12 price,51.12 price2,52.12 price3 from dual

union

select 'M13' id_m, 'T1' id_t, 113 cnt,10.13 price,11.13 price2,12.13 price3 from dual
union                                                                      
select 'M13' id_m, 'T3' id_t, 313 cnt,20.13 price,21.13 price2,22.13 price3 from dual
union                                                                      
select 'M13' id_m, 'T3' id_t, 313 cnt,30.13 price,31.13 price2,32.13 price3 from dual
union                                                                      
select 'M13' id_m, 'T4' id_t, 413 cnt,40.13 price,41.13 price2,42.13 price3 from dual
union                                                                      
select 'M13' id_m, 'T5' id_t, 513 cnt,50.13 price,51.13 price2,52.13 price3 from dual

union

select 'M14' id_m, 'T1' id_t, 114 cnt,10.14 price,11.14 price2,12.14 price3 from dual
union                                                                      
select 'M14' id_m, 'T3' id_t, 314 cnt,20.14 price,21.14 price2,22.14 price3 from dual
union                                                                      
select 'M14' id_m, 'T3' id_t, 314 cnt,30.14 price,31.14 price2,32.14 price3 from dual
union                                                                      
select 'M14' id_m, 'T4' id_t, 414 cnt,40.14 price,41.14 price2,42.14 price3 from dual
union                                                                      
select 'M14' id_m, 'T5' id_t, 514 cnt,50.14 price,51.14 price2,52.14 price3 from dual

union

select 'M15' id_m, 'T1' id_t, 115 cnt,10.15 price,11.15 price2,12.15 price3 from dual
union                                                                      
select 'M15' id_m, 'T3' id_t, 315 cnt,20.15 price,21.15 price2,22.15 price3 from dual
union                                                                      
select 'M15' id_m, 'T3' id_t, 315 cnt,30.15 price,31.15 price2,32.15 price3 from dual
union                                                                      
select 'M15' id_m, 'T4' id_t, 415 cnt,40.15 price,41.15 price2,42.15 price3 from dual
union                                                                      
select 'M15' id_m, 'T5' id_t, 515 cnt,50.15 price,51.15 price2,52.15 price3 from dual;



Получаем такую таблицу
Код: 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.
ID_M	ID_T	CNT	PRICE	PRICE2	PRICE3	
M11	T1	111	10.11	11.11	12.11	
M11	T3	311	20.11	21.11	22.11	
M11	T3	311	30.11	31.11	32.11	
M11	T4	411	40.11	41.11	42.11	
M11	T5	511	50.11	51.11	52.11	
M12	T1	112	10.12	11.12	12.12	
M12	T3	312	20.12	21.12	22.12	
M12	T3	312	30.12	31.12	32.12	
M12	T4	412	40.12	41.12	42.12	
M12	T5	512	50.12	51.12	52.12	
M13	T1	113	10.13	11.13	12.13	
M13	T3	313	20.13	21.13	22.13	
M13	T3	313	30.13	31.13	32.13	
M13	T4	413	40.13	41.13	42.13	
M13	T5	513	50.13	51.13	52.13	
M14	T1	114	10.14	11.14	12.14	
M14	T3	314	20.14	21.14	22.14	
M14	T3	314	30.14	31.14	32.14	
M14	T4	414	40.14	41.14	42.14	
M14	T5	514	50.14	51.14	52.14	
M15	T1	115	10.15	11.15	12.15	
M15	T3	315	20.15	21.15	22.15	
M15	T3	315	30.15	31.15	32.15	
M15	T4	415	40.15	41.15	42.15	
M15	T5	515	50.15	51.15	52.15	

Ее нужно развернуть в таком виде:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ID_M->	M11				M12				M13				M14				M15			
ID_T	CNT	PRICE	PRICE2	PRICE3	CNT	PRICE	PRICE2	PRICE3	CNT	PRICE	PRICE2	PRICE3	CNT	PRICE	PRICE2	PRICE3	CNT	PRICE	PRICE2	PRICE3
T1	111	10.11	11.11	12.11	112	10.12	11.12	12.12	113	10.13	11.13	12.13	114	10.14	11.14	12.14	115	10.15	11.15	12.15
T3	311	20.11	21.11	22.11	312	20.12	21.12	22.12	313	20.13	21.13	22.13	314	20.14	21.14	22.14	315	20.15	21.15	22.15
T3	311	30.11	31.11	32.11	312	30.12	31.12	32.12	313	30.13	31.13	32.13	314	30.14	31.14	32.14	315	30.15	31.15	32.15
T4	411	40.11	41.11	42.11	412	40.12	41.12	42.12	413	40.13	41.13	42.13	414	40.14	41.14	42.14	415	40.15	41.15	42.15
T5	511	50.11	51.11	52.11	512	50.12	51.12	52.12	513	50.13	51.13	52.13	514	50.14	51.14	52.14	515	50.15	51.15	52.15

Пробовал создавать таблицу с помощью динамического SQL размножая в ширину по ID_M, приписывая именам колонок сам ID_M, а затем по ключу ID_T и динамическим именам колонок вставлял данные и это работает, но столкнулся с проблемой ограничения количества колонок таблицы равной 1000. С функцией PIVOT ранее не работал, но попытки чтения документации и разбора примеров что-то ни как не помогают. Прошу помощи владеющих этой функцией в совершенстве.
...
Рейтинг: 0 / 0
Нужна помощь в развороте таблицы
    #39362560
rotation_table,

авторограничения количества колонок таблицы равной 1000
Это как же такое потом используется? Наверняка даже цикл по колонкам есть.
...
Рейтинг: 0 / 0
Нужна помощь в развороте таблицы
    #39362587
rotation_table
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если не секрет,

Потом эти данные преобразуются к некоторому виду и выделяются цветами и нужно глазами сравнивать в одной строчке по каждому ID_T в различных ID_M.
Ранее это делалось при помощи самописной проги на Delphi, но человека, писавшего код уже нету, да и оракл теперь более новый и как бы с помощью PIVOT можно развернуть, но не могу врубится что там агрегировать.
...
Рейтинг: 0 / 0
Нужна помощь в развороте таблицы
    #39362609
rotation_table,

авторвыделяются цветами и нужно глазами сравнивать
А на дворе все еще стоял XX1 век
...
Рейтинг: 0 / 0
Нужна помощь в развороте таблицы
    #39362645
rotation_table,
так пробовал?
Код: plsql
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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
with r as
 (select 'M11' id_m, 'T1' id_t, 111 cnt, 10.11 price, 11.11 price2, 12.11
price3
    from dual
  union
  select 'M11' id_m, 'T3' id_t, 311 cnt, 20.11 price, 21.11 price2, 22.11
price3
    from dual
  union
  select 'M11' id_m, 'T3' id_t, 311 cnt, 30.11 price, 31.11 price2, 32.11
price3
    from dual
  union
  select 'M11' id_m, 'T4' id_t, 411 cnt, 40.11 price, 41.11 price2, 42.11
price3
    from dual
  union
  select 'M11' id_m, 'T5' id_t, 511 cnt, 50.11 price, 51.11 price2, 52.11
price3
    from dual

  union

  select 'M12' id_m, 'T1' id_t, 112 cnt, 10.12 price, 11.12 price2, 12.12
price3
    from dual
  union
  select 'M12' id_m, 'T3' id_t, 312 cnt, 20.12 price, 21.12 price2, 22.12
price3
    from dual
  union
  select 'M12' id_m, 'T3' id_t, 312 cnt, 30.12 price, 31.12 price2, 32.12
price3
    from dual
  union
  select 'M12' id_m, 'T4' id_t, 412 cnt, 40.12 price, 41.12 price2, 42.12
price3
    from dual
  union
  select 'M12' id_m, 'T5' id_t, 512 cnt, 50.12 price, 51.12 price2, 52.12
price3
    from dual

  union

  select 'M13' id_m, 'T1' id_t, 113 cnt, 10.13 price, 11.13 price2, 12.13
price3
    from dual
  union
  select 'M13' id_m, 'T3' id_t, 313 cnt, 20.13 price, 21.13 price2, 22.13
price3
    from dual
  union
  select 'M13' id_m, 'T3' id_t, 313 cnt, 30.13 price, 31.13 price2, 32.13
price3
    from dual
  union
  select 'M13' id_m, 'T4' id_t, 413 cnt, 40.13 price, 41.13 price2, 42.13
price3
    from dual
  union
  select 'M13' id_m, 'T5' id_t, 513 cnt, 50.13 price, 51.13 price2, 52.13
price3
    from dual

  union

  select 'M14' id_m, 'T1' id_t, 114 cnt, 10.14 price, 11.14 price2, 12.14
price3
    from dual
  union
  select 'M14' id_m, 'T3' id_t, 314 cnt, 20.14 price, 21.14 price2, 22.14
price3
    from dual
  union
  select 'M14' id_m, 'T3' id_t, 314 cnt, 30.14 price, 31.14 price2, 32.14
price3
    from dual
  union
  select 'M14' id_m, 'T4' id_t, 414 cnt, 40.14 price, 41.14 price2, 42.14
price3
    from dual
  union
  select 'M14' id_m, 'T5' id_t, 514 cnt, 50.14 price, 51.14 price2, 52.14
price3
    from dual

  union

  select 'M15' id_m, 'T1' id_t, 115 cnt, 10.15 price, 11.15 price2, 12.15
price3
    from dual
  union
  select 'M15' id_m, 'T3' id_t, 315 cnt, 20.15 price, 21.15 price2, 22.15
price3
    from dual
  union
  select 'M15' id_m, 'T3' id_t, 315 cnt, 30.15 price, 31.15 price2, 32.15
price3
    from dual
  union
  select 'M15' id_m, 'T4' id_t, 415 cnt, 40.15 price, 41.15 price2, 42.15
price3
    from dual
  union
  select 'M15' id_m, 'T5' id_t, 515 cnt, 50.15 price, 51.15 price2, 52.15
price3
    from dual)
select *
  from r pivot(Min(cnt) as cnt, Min(price) as price, Min(price2) as price2,
Min(price3) as price3 for ID_M in('M11' as m11, 'M12' as m12, 'M13' as m13,
'M14' as m14, 'M15' as m15))

...
Рейтинг: 0 / 0
Нужна помощь в развороте таблицы
    #39362648
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rotation_table,

колличество id_m фиксировано?

.....
stax
...
Рейтинг: 0 / 0
Нужна помощь в развороте таблицы
    #39362678
rotation_table
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..колличество id_m фиксировано?
.....
stax
Нет, не фиксировано, но это не проблема, вставлю с помощью динамического SQL.

Если не секреттак пробовал?

Вау... Кажется то, что доктор прописал. Спасибо!!!!

Проверю на реальных данных, отпишусь, но это будет не очень быстро, надо до компа и данных добраться.
...
Рейтинг: 0 / 0
Нужна помощь в развороте таблицы
    #39362683
rotation_table,

авторВау...
"Мой вам совет ... " (с) пожалейте глазки, сделайте сверку в базе.
...
Рейтинг: 0 / 0
Нужна помощь в развороте таблицы
    #39362688
Jarod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что-то типа того...

Код: plsql
1.
2.
3.
4.
5.
6.
7.
select * from 
(select ID_T,ID_M,cnt,price,price2,price3 from scott.test01) 
pivot (
    sum(cnt) as cnt , max(PRICE) as PRICE ,max(PRICE2) as PRICE2 ,max(PRICE3) as PRICE3 	 
    for(ID_M) 
    in ('M11','M12','M13','M14','M15')
    );
...
Рейтинг: 0 / 0
Нужна помощь в развороте таблицы
    #39362832
rotation_table
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На реальных данных работает все просто супер! Огромное спасибо!

Если не секрет"Мой вам совет ... " (с) пожалейте глазки, сделайте сверку в базе.
Для этого есть специально обученные люди, это их работа. :)
...
Рейтинг: 0 / 0
Нужна помощь в развороте таблицы
    #39362975
Jafa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rotation_table, на случай если делать без pivot

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select 
    id_t,
    MIN(DECODE(id_m, 'M11', cnt)) as cnt_m11,
    MIN(DECODE(id_m, 'M11', price)) as price_m11,
    MIN(DECODE(id_m, 'M11', price2)) as price2_m11,
    MIN(DECODE(id_m, 'M11', price3)) as price3_m11,
    MIN(DECODE(id_m, 'M12', cnt)) as cnt_m12,
    MIN(DECODE(id_m, 'M12', price)) as price_m12,
    MIN(DECODE(id_m, 'M12', price2)) as price2_m12,
    MIN(DECODE(id_m, 'M12', price3)) as price3_m12,
    MIN(DECODE(id_m, 'M13', cnt)) as cnt_m13,
    MIN(DECODE(id_m, 'M13', price)) as price_m13,
    MIN(DECODE(id_m, 'M13', price2)) as price2_m13,
    MIN(DECODE(id_m, 'M13', price3)) as price3_m13
from r
group by id_t;
...
Рейтинг: 0 / 0
Нужна помощь в развороте таблицы
    #39363564
rotation_table
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jafarotation_table, на случай если делать без pivot

Тоже классный вариант на случай, если нужно расположить данные в ином порядке.
К примеру, если делаем так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select 
    id_t,
    MIN(DECODE(id_m, 'M11', cnt)) as cnt_m11,
    MIN(DECODE(id_m, 'M12', cnt)) as cnt_m12,
    MIN(DECODE(id_m, 'M13', cnt)) as cnt_m13,
    MIN(DECODE(id_m, 'M11', price)) as price_m11,
    MIN(DECODE(id_m, 'M12', price)) as price_m12,
    MIN(DECODE(id_m, 'M13', price)) as price_m13,
    MIN(DECODE(id_m, 'M11', price2)) as price2_m11,
    MIN(DECODE(id_m, 'M13', price2)) as price2_m13,
    MIN(DECODE(id_m, 'M12', price2)) as price2_m12,
    MIN(DECODE(id_m, 'M11', price3)) as price3_m11,
    MIN(DECODE(id_m, 'M12', price3)) as price3_m12,
    MIN(DECODE(id_m, 'M13', price3)) as price3_m13
from r
group by id_t;


Код: plaintext
1.
2.
3.
4.
5.
ID_T   CNT_M11    CNT_M12   CNT_M13   PRICE_M11   PRICE_M12  PRICE_M13   PRICE2_M11  PRICE2_M13  PRICE2_M12  PRICE3_M11  PRICE3_M12  PRICE3_M13
 T1       111       112       113       10.11       10.12       10.13       11.11       11.13       11.12       12.11       12.12       12.13
 T4       411       412       413       40.11       40.12       40.13       41.11       41.13       41.12       42.11       42.12       42.13
 T3       311       312       313       20.11       20.12       20.13       21.11       21.13       21.12       22.11       22.12       22.13
 T5       511       512       513       50.11       50.12       50.13       51.11       51.13       51.12       52.11       52.12       52.13

Тоже пригодится. Спасибо!
...
Рейтинг: 0 / 0
Нужна помощь в развороте таблицы
    #39363712
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rotation_table,

не поверишь, но при использовании pivot тоже можно расположить колонки как тебе захочется
...
Рейтинг: 0 / 0
Нужна помощь в развороте таблицы
    #39364505
rotation_table
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pivot оказался тоже ограничен 1000-ю колонками, а вариант с decode не ограничен ничем, так что я переделал отчет именно с decode и теперь вообще все круто работает.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Нужна помощь в развороте таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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