Превратить столбцы таблицы в строки - PullRequest
0 голосов
/ 26 января 2019

У меня есть таблица со следующей структурой.Мне нужно превратить столбцы в строки

ID  NAME      2011   2012
1   macbook   2      241
2   macbook   77     214
3   macbook   0      400
4   iphone    442    555

with tbl as (
 select  1 as id, 'macbook' as name, 2 as "2011", 241 as "2012" from dual union
 select  2 as id, 'macbook' as name, 77 as "2011", 214 as "2012" from dual union
 select  3 as id, 'macbook' as name, 0 as "2011", 400 as "2012" from dual union
 select  4 as id, 'iphone' as name, 442 as "2011", 555 as "2012" from dual
)
select * from tbl

Я использую базу данных Oracle, я попытался решить эту проблему с помощью функции unpivot, но я установил

Я ожидаю получитьтакой результат

ID  NAME    DATE    SALES
1   macbook 2011    2
1   macbook 2012    241
2   macbook 2011    77
2   macbook 2012    214
3   macbook 2011    0
3   macbook 2012    400
4   iphone  2011    442
4   iphone  2012    555

Ответы [ 3 ]

0 голосов
/ 26 января 2019

Вы можете просто ПЕРЕКРЕСТИТЬСЯ в таблицу со списком дат, а затем использовать DECODE, чтобы вывести соответствующую годовую продажную стоимость в каждой строке.

SELECT 
    t.id,
    t.name.
    t.dt "date",
    DECODE(t.dt, 2011, t."2011", 2012, t."2012", 0) sales
FROM mytable t
CROSS JOIN (
    SELECT 2011 dt FROM DUAL
    UNION SELECT 2012 FROM DUAL
) d
ORDER BY 1,2
0 голосов
/ 26 января 2019

Попробуйте: используя unpivot

with tbl as (
 select  1 as id, 'macbook' as name, 2 as "2011", 241 as "2012" from dual union
 select  2 as id, 'macbook' as name, 77 as "2011", 214 as "2012" from dual union
 select  3 as id, 'macbook' as name, 0 as "2011", 400 as "2012" from dual union
 select  4 as id, 'iphone' as name, 442 as "2011", 555 as "2012" from dual
)
select * from tbl
UNPIVOT (SALES FOR "DATE" IN ("2011" AS '2011', "2012" AS '2012'));

ВЫХОД:

enter image description here

0 голосов
/ 26 января 2019

С 2 подзапросами, каждый из которых получает результат за каждый год, а затем UNION:

select * from (
    select t.id, t.name, '2011' as "date", t."2011" as sales from tbl t  
    union all
    select t.id, t.name, '2012' as "date", t."2012" as sales from tbl t
) t
order by t.id, t.name, t."date"

См. Демоверсию

...