Oracle Pivot с агрегацией - PullRequest
       34

Oracle Pivot с агрегацией

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

У меня есть эта таблица:

id  |  attr  |  val
1      'A'      1.2
1      'A'      2.4
1      'B'      2.4 
1      'B'      0.5
2      'A'      0.8
2      'A'      1.6
2      'B'      1.8
2      'B'      2.0

Для каждого идентификатора я бы хотел усреднить значения avg(val) для каждого общего атрибута.Я попробовал следующее:

select id, 
    case when count(case when attr = 'A' then 1 end) > 0 
        then round(avg(val),2) end A,
    case when count(case when attr = 'B' then 1 end) > 0 
        then round(avg(val),2) end B,
    case when count(case when attr = 'C' then 1 end) > 0 
        then round(avg(val),2) end C
from table where this = 'that'
group by id;

Pivot / AVG работает для первого атрибута, но затем другие атрибуты получают то же значение:

id  |  A  |  B
1     1.8   1.8 
2     1.2   1.2

Затем я попробовал это, но каждый атрибутбыл выведен в новой строке:

  select id, 
      case when attr = 'A' then round(avg(val),2) end A,
      case when attr = 'B' then round(avg(val),2) end B,
      case when attr = 'C' then round(avg(val),2) end C,
  from table where this = 'that'
  group by id, attr;

1 Ответ

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

Вы можете использовать conditional aggregation как

  with tab( id, attr, val) as
  (
     select 1,'A',1.2 from dual union all
     select 1,'A',2.4 from dual union all
     select 1,'B',2.4 from dual union all 
     select 1,'B',0.5 from dual union all
     select 2,'A',0.8 from dual union all
     select 2,'A',1.6 from dual union all
     select 2,'B',1.8 from dual union all
     select 2,'B',2.0 from dual   
  )    
  select id, 
         round(avg(case when attr = 'A' then val end),2) A,
         round(avg(case when attr = 'B' then val end),2) B
    from tab 
   group by id

   ID   A     B
   ---  ----  ----
   1    1,80  1,45
   2    1,20  1,90

Rextester Demo

...