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

Откуда:
Сообщений: 6
В наличии есть строка:
select 1 as id, 10 as num1, 11 as num2, 12 as num3, 'p' as str1, 's' as str2, date '2018-01-01' as dt1 from dual

Необходимо привести к следующему виду:
1	NUM1	10    	Null	Null
1	NUM2	11    	Null	Null
1	NUM3	12    	Null	Null
1	STR1	Null	p     	Null
1	STR2	Null	s     	Null
1	DT1 	Null	Null	01.01.2018

Ничего умнее, чем тройной unpivot с union all не придумал:
with t as (
select 1 as id, 10 as num1, 11 as num2, 12 as num3, 'p' as str1, 's' as str2, date '2018-01-01' as dt1 from dual
)
select id, grp, num_val, to_char(null) as str_val, to_date(null) as dt_val from t unpivot (num_val for grp in (NUM1, NUM2, NUM3))
union all
select id, grp, null, str_val, null from t unpivot (str_val for grp in (STR1, STR2))
union all
select id, grp, null, null, dt_val from t unpivot (dt_val for grp in (DT1))


Есть ли варианты покрасивше?
9 окт 18, 11:59    [21699087]     Ответить | Цитировать Сообщить модератору
 Re: unpivot  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1421
ffzx1,
SQL> l
  1  select
  2    id
  3   ,decode(u.p,1,'num1',2,'num2',3,'num3',4,'str1',5,'str2',6,'dt1') gr
  4   ,decode(u.p,1,num1,2,num2,3,num3) u1
  5   ,decode(u.p,4,str1,5,str2) u2
  6   ,decode(u.p,6,dt1) u3
  7  from (select 1 as id, 10 as num1, 11 as num2, 12 as num3, 'p' as str1, 's' as str2, date '2018-01-01' as dt1 from dual) t
  8* ,(select level p from dual connect by level<7) u
SQL> /

        ID GR           U1 U2   U3
---------- ---- ---------- ---- --------
         1 num1         10 null null
         1 num2         11 null null
         1 num3         12 null null
         1 str1 null       p    null
         1 str2 null       s    null
         1 dt1  null       null 01.01.18

6 rows selected.


обычный ручной унпивот

.....
stax
9 окт 18, 12:17    [21699123]     Ответить | Цитировать Сообщить модератору
 Re: unpivot  [new]
-2-
Member

Откуда:
Сообщений: 14118
ffzx1,

добавь подзапрос с null-колонкой и распиши комбинированные комбинации в unpivot-что и в unpivot-где.
9 окт 18, 12:23    [21699136]     Ответить | Цитировать Сообщить модератору
 Re: unpivot  [new]
ffzx1
Member

Откуда:
Сообщений: 6
-2-
ffzx1,

добавь подзапрос с null-колонкой и распиши комбинированные комбинации в unpivot-что и в unpivot-где.


Если честно, не догнал. Можете носом в пример ткнуть, если не трудно?
9 окт 18, 12:34    [21699149]     Ответить | Цитировать Сообщить модератору
 Re: unpivot  [new]
-2-
Member

Откуда:
Сообщений: 14118
select *
from (select t.*, null пи11 from t) t1
unpivot ((numval, strval, datval) for grp   in (
         (  num1,   пи11,   пи11) as 'NUM1',
         (  num2,   пи11,   пи11) as 'NUM2',
         (  num3,   пи11,   пи11) as 'NUM3',
         (  пи11,   str1,   пи11) as 'STR1',
         (  пи11,   str2,   пи11) as 'STR2',
         (  пи11,   пи11,    dt1) as 'DT1'
        ))
9 окт 18, 12:41    [21699158]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить