Сводная таблица без использования агрегатной функции с использованием Oracle SQL - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть таблица1 со следующей структурой

          type month1 month2 month3 month4
           A     20    30      40    5
           B     10    30      50    7
           C     13    30      80    8

Я пытаюсь получить вывод ниже, используя table1

          month    A   B   C
          month1  20   10  13
          month2  30   30  30
          month3  40   50  80
          month4  5    7   8

В общем, его sql для получения каждого столбца в виде строки.Агрегирование здесь не требуется.

Я написал следующее sql

             select decode (TYPE,'A',month1,null) A,
             decode (TYPE,'B',month1,null) B,
             decode (TYPE,'C',month1,null) C
             from table1

Но его нулевые значения дают очевидную причину: я добавил нуль в операторе декодирования.Я попытался дать месячные значения в декодировании, но это не работает, так как один декодер создаст одну строку.Может кто-нибудь предложить мне лучше подойти сюда?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вы можете сначала применить unpivot в подзапросе и decode с группой по month как:

select month, max(decode(type,'A',value)) as "A",
              max(decode(type,'B',value)) as "B",
              max(decode(type,'C',value)) as "C"
  from
  (
    with t ( type, month1, month2, month3, month4 ) as
    (
     select 'A',20,30,40,5 from dual union all
     select 'B',10,30,50,7 from dual union all
     select 'C',13,30,80,8 from dual
    )    
    select type, month, value 
      from
         ( Select *
             From t ) p
    unpivot  
       (value for month in
          ( month1, month2, month3, month4)  
    ) unpvt
   ) 
group by month
order by month;

MONTH   A   B   C
------  --  --  --
MONTH1  20  10  13
MONTH2  30  30  30
MONTH3  40  50  80
MONTH4  5   7   8

Rextester Demo

0 голосов
/ 19 декабря 2018

Хотя декодирование будет лучше, но вы также можете использовать UNION для достижения тех же результатов.

Select 'month1' as month
, sum(case when type = 'A' then month1 else null end) as A
, sum(case when type = 'B' then month1 else null end) as B
, sum(case when type = 'C' then month1 else null end) as C
from table1
group by 'month1'

UNION ALL

Select 'month2' as month
, sum(case when type = 'A' then month2 else null end) as A
, sum(case when type = 'B' then month2 else null end) as B
, sum(case when type = 'C' then month2 else null end) as C
from table1
group by 'month2'

UNION ALL

Select 'month3' as month
, sum(case when type = 'A' then month3 else null end) as A
, sum(case when type = 'B' then month3 else null end) as B
, sum(case when type = 'C' then month3 else null end) as C
from table1
group by 'month3'

UNION ALL

Select 'month4' as month
, sum(case when type = 'A' then month4 else null end) as A
, sum(case when type = 'B' then month4 else null end) as B
, sum(case when type = 'C' then month4 else null end) as C
from table1
group by 'month4'

SQL Fiddle

...