Oracle Поворот нескольких столбцов - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть данные, которые выглядят так:

age sex value   option              
1   f   0.019500000000000000    OPTION_1                
2   f   0.019500000000000000    OPTION_1                
3   f   0.019500000000000000    OPTION_1                
4   f   0.019500000000000000    OPTION_1                
5   f   0.019500000000000000    OPTION_1                        
1   m   0.081000000000000002    OPTION_1                
2   m   0.081000000000000002    OPTION_1                
3   m   0.081000000000000002    OPTION_1                
4   m   0.081000000000000002    OPTION_1                
5   m   0.081000000000000002    OPTION_1                
1   f   0.159000000000000002    OPTION_2                
2   f   0.107999999999999999    OPTION_2                
3   f   0.073500000000000009    OPTION_2                
4   f   0.063000000000000000    OPTION_2                
5   f   0.059999999999999997    OPTION_2                            
1   m   0.307499999999999996    OPTION_2                
2   m   0.220500000000000002    OPTION_2                
3   m   0.156000000000000000    OPTION_2                
4   m   0.133500000000000008    OPTION_2                
5   m   0.115500000000000005    OPTION_2                        

Я могу повернуть эти данные, чтобы получить

age k   m
1   0.0195  0.081
2   0.0195  0.081
3   0.0195  0.081
4   0.0195  0.081
5   0.0195  0.081

Но это только для OPTION_1. Вопрос в том, могу ли я получить в одном запросе вывод типа

age k_option_1  m_option_1 k_option_2   m_option_2
1   0.0195  0.081   0.1590  0.307
2   0.0195  0.081   0.1079  0.220
3   0.0195  0.081   0.0735  0.156
4   0.0195  0.081   0.0630  0.133
5   0.0195  0.081   0.0599  0.115

, а также добавить результаты в опцию OPTION_2?

Ответы [ 3 ]

0 голосов
/ 17 апреля 2020

Если вы хотите использовать пивот

  Select * from table 
  Pivot
    (max(case when sex='f' then value 
     end) 
      ) for option in ('option1',
    'option2'))
   Pivot
    (max(case when sex='m' then value 
     end) 
      ) for option in ('option1',
    'option2'))
0 голосов
/ 17 апреля 2020

Предложение PIVOT может обрабатывать более одного сводного столбца одновременно:

create table t(age,sex,val,opt ) as            
select 1, 'f', 0.019500000000000000, 'OPTION_1' from dual union all
select 2, 'f', 0.019500000000000000, 'OPTION_1' from dual union all
select 3, 'f', 0.019500000000000000, 'OPTION_1' from dual union all
select 4, 'f', 0.019500000000000000, 'OPTION_1' from dual union all
select 5, 'f', 0.019500000000000000, 'OPTION_1' from dual union all
select 1, 'm', 0.081000000000000002, 'OPTION_1' from dual union all
select 2, 'm', 0.081000000000000002, 'OPTION_1' from dual union all
select 3, 'm', 0.081000000000000002, 'OPTION_1' from dual union all
select 4, 'm', 0.081000000000000002, 'OPTION_1' from dual union all
select 5, 'm', 0.081000000000000002, 'OPTION_1' from dual union all
select 1, 'f', 0.159000000000000002, 'OPTION_2' from dual union all
select 2, 'f', 0.107999999999999999, 'OPTION_2' from dual union all
select 3, 'f', 0.073500000000000009, 'OPTION_2' from dual union all
select 4, 'f', 0.063000000000000000, 'OPTION_2' from dual union all
select 5, 'f', 0.059999999999999997, 'OPTION_2' from dual union all
select 1, 'm', 0.307499999999999996, 'OPTION_2' from dual union all
select 2, 'm', 0.220500000000000002, 'OPTION_2' from dual union all
select 3, 'm', 0.156000000000000000, 'OPTION_2' from dual union all
select 4, 'm', 0.133500000000000008, 'OPTION_2' from dual union all
select 5, 'm', 0.115500000000000005, 'OPTION_2' from dual;

select * from t
pivot(max(val) for (sex, opt) in (
  ('f','OPTION_1') as f_1,
  ('m','OPTION_1') as m_1,
  ('f','OPTION_2') as f_2,
  ('m','OPTION_2') as m_2
));

AGE F_1     M_1                   F_2                   M_2
1   0,0195  0,081000000000000002  0,159000000000000002  0,307499999999999996
2   0,0195  0,081000000000000002  0,107999999999999999  0,220500000000000002
4   0,0195  0,081000000000000002  0,063                 0,133500000000000008
5   0,0195  0,081000000000000002  0,059999999999999997  0,115500000000000005
3   0,0195  0,081000000000000002  0,073500000000000009  0,156
0 голосов
/ 17 апреля 2020

Просто используйте условное агрегирование:

select age,
       max(case when sex = 'f' and option = 1 then value end) as f_option_1,
       max(case when sex = 'm' and option = 1 then value end) as m_option_1,
       max(case when sex = 'f' and option = 2 then value end) as f_option_2,
       max(case when sex = 'm' and option = 2 then value end) as m_option_2
from t
group by age;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...