Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Нужна помощь в развороте таблицы / 14 сообщений из 14, страница 1 из 1
08.12.2016, 14:06
    #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
08.12.2016, 14:18
    #39362560
Нужна помощь в развороте таблицы
rotation_table,

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

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

авторвыделяются цветами и нужно глазами сравнивать
А на дворе все еще стоял XX1 век
...
Рейтинг: 0 / 0
08.12.2016, 15:20
    #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
08.12.2016, 15:23
    #39362648
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в развороте таблицы
rotation_table,

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

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

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

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

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

авторВау...
"Мой вам совет ... " (с) пожалейте глазки, сделайте сверку в базе.
...
Рейтинг: 0 / 0
08.12.2016, 15:58
    #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
08.12.2016, 17:34
    #39362832
rotation_table
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в развороте таблицы
На реальных данных работает все просто супер! Огромное спасибо!

Если не секрет"Мой вам совет ... " (с) пожалейте глазки, сделайте сверку в базе.
Для этого есть специально обученные люди, это их работа. :)
...
Рейтинг: 0 / 0
08.12.2016, 20:47
    #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
09.12.2016, 15:45
    #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
09.12.2016, 17:31
    #39363712
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в развороте таблицы
rotation_table,

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


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