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

Имеется , например, таблица:



SubjectMin_PriceMax_PriceColorSizeСтол100200ВенгеБольшойСтул1030ЗеленыйСреднийШкаф5001000 ОрехНебольшой
.........

Необходимо преобразовать в таблицу:
Sybject Attribute ValueСтол Min_Price 100Стол Min_Price 200Стол Color ВенгеСтол Size БольшойСтул Min_Price 10Стул Min_Price 30Стул Color ЗеленыйСтул Size СреднийШкаф Min_Price 500Шкаф Min_Price 1000Шкаф Color ОрехШкаф Size Небольшой
.....


Как это можно сделать наилучшим образом????
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39613971
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39613991
Типа так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Примерно вот так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
With Table1(Subject,Min_Price,Max_Price,Color,sSize) as 
     (select 'Стол','100','200','Венге','Большой' from dual
      union all
      select 'Стул','10','30','Зеленый','Средний' from dual
      union all
      select 'Шкаф','500','1000','Орех','Небольшой' from dual)

select Subject, quarter, sResult 
from Table1
     unpivot
     (sResult  FOR quarter in (Min_Price,Max_Price,Color,sSize))
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39613996
LFDY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь, допустил ошибку..

Необходимо преобразовать в таблицу:
Sybject Attribute ValueСтол Min_Price 100Стол Max_Price 200Стол Color ВенгеСтол Size БольшойСтул Min_Price 10Стул Max_Price 30Стул Color ЗеленыйСтул Size СреднийШкаф Min_Price 500Шкаф Max_Price 1000Шкаф Color ОрехШкаф Size Небольшой
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39614013
Типа так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чем это не устраивает?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
With Table1(Subject,Min_Price,Max_Price,Color,sSize) as 
     (select 'Стол','100','200','Венге','Большой' from dual
      union all
      select 'Стул','10','30','Зеленый','Средний' from dual
      union all
      select 'Шкаф','500','1000','Орех','Небольшой' from dual)

select Subject, quarter as Attribute, Value 
from Table1
     UNPIVOT
       (Value  FOR quarter in (Min_Price,Max_Price,Color,sSize))
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39614029
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Типа такЧем это не устраивает?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
With Table1(Subject,Min_Price,Max_Price,Color,sSize) as 
     (select 'Стол','100','200','Венге','Большой' from dual
      union all
      select 'Стул','10','30','Зеленый','Средний' from dual
      union all
      select 'Шкаф','500','1000','Орех','Небольшой' from dual)

select Subject, quarter as Attribute, Value 
from Table1
     UNPIVOT
       (Value  FOR quarter in (Min_Price,Max_Price,Color,sSize))



какая теперь цена зеленого стула?

.....
stax
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39614045
Типа так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так какая изначально задача была - просто преобразовать таблицу, развернув строку в столбец, или что-то еще посчитать?
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39614050
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Типа такТак какая изначально задача была - просто преобразовать таблицу, развернув строку в столбец, или что-то еще посчитать?
поставленная задача Вами решена, но ...


ps
почему б quarter сразу не обозначить Attribute
.....
stax
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39614065
LFDY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторпочему б quarter сразу не обозначить Attribute
Да это уже не принципиально ;-))

Спасибо большое !!!! Решение найдено..(UNPIVOT)... Все гибко и красиво...!!
А то мы здесь огород с UNIONами начали уже строить...;-))
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39614831
LFDY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, подскажите , пожалуйста..
Как можно сделать обратное преобразование таблицы, с помощью PIVOT???


Решил изучить функцию, но ничего не получается ;-((


Код: sql
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.
With Table1(SUBJECT,ATTRIBUTE,VALUE) AS
(SELECT 'Стол','MIN_PRICE','100' FROM DUAL
UNION ALL
SELECT 'Стол','MAX_PRICE','200' FROM DUAL
UNION ALL
SELECT 'Стол','COLOR','Венге' FROM DUAL
UNION ALL
SELECT 'Стол','SSIZE','Большой' FROM DUAL
UNION ALL
SELECT 'Стул','MIN_PRICE','10' FROM DUAL
UNION ALL
SELECT 'Стул','MAX_PRICE','30' FROM DUAL
UNION ALL
SELECT 'Стул','COLOR','Зеленый' FROM DUAL
UNION ALL
SELECT 'Стул','SSIZE','Средний' FROM DUAL
UNION ALL
SELECT 'Шкаф','MIN_PRICE','500' FROM DUAL
UNION ALL
SELECT 'Шкаф','MAX_PRICE', '1000' FROM DUAL
UNION ALL
SELECT 'Шкаф','COLOR','Орех' FROM DUAL
UNION ALL
SELECT 'Шкаф','SSIZE','Небольшой' FROM DUAL)



select SUBJECT, ...........................
from Table1
PIVOT ( ........................  ) as  P
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39614834
LFDY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
то есть к виду



Subject Min_Price Max_Price Color Size Стол 100 200 Венге Большой Стул 10 30 Зеленый Средний Шкаф 500 1000 Орех Небольшой
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39614840
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LFDYРешил изучить функцию, но ничего не получается ;-((Чудак, по той же ссылке разжёвываются и Pivoting Operations.
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39614925
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LFDYто есть к виду



Subject Min_Price Max_Price Color Size Стол 100 200 Венге Большой Стул 10 30 Зеленый Средний Шкаф 500 1000 Орех Небольшой
с чего Вы взяли что для зеленого стула мин=10 мах=30?

нужно еще одно поле

зи
21252358

......
stax
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39615018
LFDY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Данный пример с мебелью не реальный , скорее аллегория. ;-)

Но в реальной таблице такой же набор типов данных.. Вместо Цены можно взять вес.. длину или что-то другое.. Важно, что есть минимальный и максимальный порог.. а вот другие показатели имеют фиксированное значение .

цель - конвертация таблицы из одной систему в другую..
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39615182
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LFDYДанный пример с мебелью не реальный , скорее аллегория. ;-)

Но в реальной таблице такой же набор типов данных.. Вместо Цены можно взять вес.. длину или что-то другое.. Важно, что есть минимальный и максимальный порог.. а вот другие показатели имеют фиксированное значение .

цель - конвертация таблицы из одной систему в другую..

то я виноват, подслеповат, упорно не видел что у Вас стол и стул,
со своим зрением я их не отличыл, так что сорри

будем считать что SUBJECT уникальны

Код: 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.
  1  With T(SUBJECT,ATTRIBUTE,VALUE) AS
  2  (SELECT 'Стол','MIN_PRICE','100' FROM DUAL
  3  UNION ALL
  4  SELECT 'Стол','MAX_PRICE','200' FROM DUAL
  5  UNION ALL
  6  SELECT 'Стол','COLOR','Венге' FROM DUAL
  7  UNION ALL
  8  SELECT 'Стол','SSIZE','Большой' FROM DUAL
  9  UNION ALL
 10  SELECT 'Стул','MIN_PRICE','10' FROM DUAL
 11  UNION ALL
 12  SELECT 'Стул','MAX_PRICE','30' FROM DUAL
 13  UNION ALL
 14  SELECT 'Стул','COLOR','Зеленый' FROM DUAL
 15  UNION ALL
 16  SELECT 'Стул','SSIZE','Средний' FROM DUAL
 17  UNION ALL
 18  SELECT 'Шкаф','MIN_PRICE','500' FROM DUAL
 19  UNION ALL
 20  SELECT 'Шкаф','MAX_PRICE', '1000' FROM DUAL
 21  UNION ALL
 22  SELECT 'Шкаф','COLOR','Орех' FROM DUAL
 23  UNION ALL
 24  SELECT 'Шкаф','SSIZE','Небольшой' FROM DUAL)
 25  select * from t
 26  pivot (max(value) for ATTRIBUTE in (
 27  'MIN_PRICE' as MIN_PRICE,'MAX_PRICE' as MAX_PRICE, 'COLOR' as COLOR,'SSIZE' as SSIZE
 28  ))
 29* order by 1
SQL> /

SUBJ MIN_PRICE MAX_PRICE COLOR     SSIZE
---- --------- --------- --------- ---------
Стол 100       200       Венге     Большой
Стул 10        30        Зеленый   Средний
Шкаф 500       1000      Орех      Небольшой



чтоб легче запомнить кляузу pivot возпринимайте ее как неявный group by

....
stax
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39615249
LFDY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все оказывается, просто!!! СПАСИБО БОЛЬШОЕ!!!
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39683040
Фотография Pastic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начал разбираться с этим unpivot и сделал так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with t as
(select 'Чугун экспорт' name1, 'FOB Черное море' name2, 'Чугун' name3, 63 course_dol,
   393 beg_price, 22476 price_exw, 20014 cost_price, 2462 marge from dual union all
 select 'Арматура 14-25 мм, А500С РФ' name1, 'FCA-склад Москва' name2, 'Арматура' name3,
   63 course_dol, 37600 beg_price, 29647 price_exw, 30566 cost_price, -919 marge from dual
 union all
 select 'Круг 40Х 40мм, 40Х РФ (10 плавок)' name1, 'FCA-склад Москва' name2,
   'Круг 40Х 10 плавок' name3, 63 course_dol, 48180 beg_price, 38186 price_exw,
   33455 cost_price, 4731 marge
 from dual)
select name1, quarter, sResult
from t
unpivot (sResult FOR quarter in (name2, name3, COURSE_DOL, BEG_PRICE, PRICE_EXW, COST_PRICE, MARGE))



PL/SQL Developer поставил курсор на COURSE_DOL и написал: "ORA-01790: выражение должно иметь тот же тип данных, что и соответствующее выражение".

Тогда я написал так (добавил преобразование to_char):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t as
(select 'Чугун экспорт' name1, 'FOB Черное море' name2, 'Чугун' name3, 63 course_dol,
   393 beg_price, 22476 price_exw, 20014 cost_price, 2462 marge from dual union all
 select 'Арматура 14-25 мм, А500С РФ' name1, 'FCA-склад Москва' name2, 'Арматура' name3,
   63 course_dol, 37600 beg_price, 29647 price_exw, 30566 cost_price, -919 marge from dual
 union all
 select 'Круг 40Х 40мм, 40Х РФ (10 плавок)' name1, 'FCA-склад Москва' name2,
   'Круг 40Х 10 плавок' name3, 63 course_dol, 48180 beg_price, 38186 price_exw,
   33455 cost_price, 4731 marge
 from dual)
select name1, quarter, sResult
from t
unpivot (sResult FOR quarter in (name2, name3, to_char(COURSE_DOL),
  to_char(BEG_PRICE), to_char(PRICE_EXW), to_char(COST_PRICE), to_char(MARGE)))



Тогда PL/SQL Developer опять поставил курсор на COURSE_DOL и написал: "ORA-00917: отсутствует запятая".
Тогда я написал так (добавил в преобразование to_char указание явного формата преобразования):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with t as
(select 'Чугун экспорт' name1, 'FOB Черное море' name2, 'Чугун' name3, 63 course_dol,
   393 beg_price, 22476 price_exw, 20014 cost_price, 2462 marge from dual union all
 select 'Арматура 14-25 мм, А500С РФ' name1, 'FCA-склад Москва' name2, 'Арматура' name3,
   63 course_dol, 37600 beg_price, 29647 price_exw, 30566 cost_price, -919 marge from dual
 union all
 select 'Круг 40Х 40мм, 40Х РФ (10 плавок)' name1, 'FCA-склад Москва' name2,
   'Круг 40Х 10 плавок' name3, 63 course_dol, 48180 beg_price, 38186 price_exw,
   33455 cost_price, 4731 marge
 from dual)
select name1, quarter, sResult
from t
unpivot (sResult FOR quarter in (name2, name3,
  to_char(COURSE_DOL, 'FM99999999999999999999999999999999999990.99'),
  to_char(BEG_PRICE, 'FM99999999999999999999999999999999999990.99'),
  to_char(PRICE_EXW, 'FM99999999999999999999999999999999999990.99'),
  to_char(COST_PRICE, 'FM99999999999999999999999999999999999990.99'),
  to_char(MARGE, 'FM99999999999999999999999999999999999990.99')))



Тогда PL/SQL Developer опять поставил курсор на COURSE_DOL и опять написал: "ORA-00917: отсутствует запятая".

Что я написал неправильно?
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39683061
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pastic,

Сделайте новое поле с преобразованием на уровне cte и используйте уже в кляузе.
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39683064
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pastic,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t as
(select 'Чугун экспорт' name1, 'FOB Черное море' name2, 'Чугун' name3, 63 course_dol,
   393 beg_price, 22476 price_exw, 20014 cost_price, 2462 marge from dual union all
 select 'Арматура 14-25 мм, А500С РФ' name1, 'FCA-склад Москва' name2, 'Арматура' name3,
   63 course_dol, 37600 beg_price, 29647 price_exw, 30566 cost_price, -919 marge from dual
 union all
 select 'Круг 40Х 40мм, 40Х РФ (10 плавок)' name1, 'FCA-склад Москва' name2,
   'Круг 40Х 10 плавок' name3, 63 course_dol, 48180 beg_price, 38186 price_exw,
   33455 cost_price, 4731 marge
 from dual)
select *
from (select name1,name2, name3, to_char(COURSE_DOL) COURSE_DOL,
  to_char(BEG_PRICE) BEG_PRICE, to_char(PRICE_EXW) PRICE_EXW, to_char(COST_PRICE) COST_PRICE, to_char(MARGE) MARGE from t)
unpivot (sResult FOR quarter in (name2, name3, COURSE_DOL, BEG_PRICE, PRICE_EXW, COST_PRICE, MARGE))
...
Рейтинг: 0 / 0
HELP! Преобразование таблицы
    #39683096
Фотография Pastic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL, большое спасибо.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / HELP! Преобразование таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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