Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 HELP! Преобразование таблицы  [new]
LFDY
Member

Откуда:
Сообщений: 7
Добрый день!!
Гуру, подскажите, пожалуйста!!

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



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 Небольшой

.....


Как это можно сделать наилучшим образом????
13 мар 18, 10:45    [21252054]     Ответить | Цитировать Сообщить модератору
 Re: HELP! Преобразование таблицы  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 27979
RTFM Unpivoting Operations (FAQ)
13 мар 18, 10:51    [21252101]     Ответить | Цитировать Сообщить модератору
 Re: HELP! Преобразование таблицы  [new]
Типа так
Guest
Примерно вот так:

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))
13 мар 18, 11:15    [21252205]     Ответить | Цитировать Сообщить модератору
 Re: HELP! Преобразование таблицы  [new]
LFDY
Member

Откуда:
Сообщений: 7
Извиняюсь, допустил ошибку..

Необходимо преобразовать в таблицу:
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 Небольшой
13 мар 18, 11:18    [21252220]     Ответить | Цитировать Сообщить модератору
 Re: HELP! Преобразование таблицы  [new]
Типа так
Guest
Чем это не устраивает?

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))
13 мар 18, 11:36    [21252290]     Ответить | Цитировать Сообщить модератору
 Re: HELP! Преобразование таблицы  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1106
Типа так
Чем это не устраивает?

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
13 мар 18, 11:56    [21252358]     Ответить | Цитировать Сообщить модератору
 Re: HELP! Преобразование таблицы  [new]
Типа так
Guest
Так какая изначально задача была - просто преобразовать таблицу, развернув строку в столбец, или что-то еще посчитать?
13 мар 18, 12:19    [21252418]     Ответить | Цитировать Сообщить модератору
 Re: HELP! Преобразование таблицы  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1106
Типа так
Так какая изначально задача была - просто преобразовать таблицу, развернув строку в столбец, или что-то еще посчитать?

поставленная задача Вами решена, но ...


ps
почему б quarter сразу не обозначить Attribute
.....
stax
13 мар 18, 12:33    [21252446]     Ответить | Цитировать Сообщить модератору
 Re: HELP! Преобразование таблицы  [new]
LFDY
Member

Откуда:
Сообщений: 7
автор
почему б quarter сразу не обозначить Attribute

Да это уже не принципиально ;-))

Спасибо большое !!!! Решение найдено..(UNPIVOT)... Все гибко и красиво...!!
А то мы здесь огород с UNIONами начали уже строить...;-))
13 мар 18, 12:55    [21252527]     Ответить | Цитировать Сообщить модератору
 Re: HELP! Преобразование таблицы  [new]
LFDY
Member

Откуда:
Сообщений: 7
Коллеги, подскажите , пожалуйста..
Как можно сделать обратное преобразование таблицы, с помощью PIVOT???


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


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
14 мар 18, 15:41    [21255913]     Ответить | Цитировать Сообщить модератору
 Re: HELP! Преобразование таблицы  [new]
LFDY
Member

Откуда:
Сообщений: 7
то есть к виду



Subject Min_Price Max_Price Color Size
Стол 100 200 Венге Большой
Стул 10 30 Зеленый Средний
Шкаф 500 1000 Орех Небольшой
14 мар 18, 15:44    [21255918]     Ответить | Цитировать Сообщить модератору
 Re: HELP! Преобразование таблицы  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 27979
LFDY
Решил изучить функцию, но ничего не получается ;-((
Чудак, по той же ссылке разжёвываются и Pivoting Operations.
14 мар 18, 15:47    [21255931]     Ответить | Цитировать Сообщить модератору
 Re: HELP! Преобразование таблицы  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1106
LFDY
то есть к виду



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

с чего Вы взяли что для зеленого стула мин=10 мах=30?

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

зи
21252358

......
stax
14 мар 18, 17:42    [21256462]     Ответить | Цитировать Сообщить модератору
 Re: HELP! Преобразование таблицы  [new]
LFDY
Member

Откуда:
Сообщений: 7
Данный пример с мебелью не реальный , скорее аллегория. ;-)

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

цель - конвертация таблицы из одной систему в другую..
14 мар 18, 20:28    [21256880]     Ответить | Цитировать Сообщить модератору
 Re: HELP! Преобразование таблицы  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1106
LFDY
Данный пример с мебелью не реальный , скорее аллегория. ;-)

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

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


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

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

  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
15 мар 18, 09:40    [21257573]     Ответить | Цитировать Сообщить модератору
 Re: HELP! Преобразование таблицы  [new]
LFDY
Member

Откуда:
Сообщений: 7
Все оказывается, просто!!! СПАСИБО БОЛЬШОЕ!!!
15 мар 18, 11:20    [21257909]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить