Как преобразовать столбец со значением ранга в строки в Oracle - PullRequest
0 голосов
/ 07 октября 2019

У меня есть запрос, который возвращает следующие данные:

Month Year EMP_ID EMP_NAME RANK
Jan   2019  1       EmpName1    1
Jan   2019  2       EmpName2    2
Jan   2019  3       EmpName3    3
Jan   2019  4       EmpName4    4
Jan   2019  5       EmpName5    5
FEB   2019  1       EmpName1    1
FEB   2019  2       EmpName2    2
FEB   2019  3       EmpName3    3
FEB   2019  4       EmpName4    4
FEM   2019  5       EmpName5    5

Я хочу отобразить эти данные в следующем формате:

Month Year  Rank1        Rank2     Rank3      Rank4       Rank5
Jan   2019 EmpName1    EmpNAme2   EmpName3  EmpName4    EmpName5
Feb   2019 EmpName1    EmpNAme2   EmpName3  EmpName4    EmpName5

Ответы [ 2 ]

3 голосов
/ 07 октября 2019

Просто используйте Conditional Aggregation с case..when выражениями:

select Month, Year,
       max( case when emp_id = 1 then Emp_Name end ) as EmpName1,
       max( case when emp_id = 2 then Emp_Name end ) as EmpName2,
       max( case when emp_id = 3 then Emp_Name end ) as EmpName3,
       max( case when emp_id = 4 then Emp_Name end ) as EmpName4,
       max( case when emp_id = 5 then Emp_Name end ) as EmpName5
  from tab
 group by Month, Year 
3 голосов
/ 07 октября 2019

Если в версии Oracle 11+ используется pivot

with tbl as
(SELECT 'JAN' mon,   '2019' y, '1' rn, 'EmpName1' name from dual
UNION ALL 
select 'JAN', '2019', '2', 'EmpName2' from dual 
union all 
select 'JAN', '2019', '3', 'EmpName3' from dual
union all
select 'JAN', '2019', '4', 'EmpName4' from dual
union all
select 'JAN', '2019', '5', 'EmpName5' from dual
union all
select 'FEB', '2019', '1', 'EmpName1' from dual
union all
select 'FEB', '2019', '2', 'EmpName2' from dual
union all
select 'FEB', '2019', '3', 'EmpName3' from dual
union all
select 'FEB', '2019', '4', 'EmpName4' from dual
union all
select 'FEB', '2019', '5', 'EmpName5' from dual)
select *  
from (select mon, y, rn, name 
from tbl)
pivot
(
  MAX(name)
  FOR rn
  IN ('1', '2', '3', '4', '5')
)
ORDER BY 1

, если 10g

with tbl as
(SELECT 'JAN' mon,   '2019' y, '1' rn, 'EmpName1' name from dual
UNION ALL 
select 'JAN', '2019', '2', 'EmpName2' from dual 
union all 
select 'JAN', '2019', '3', 'EmpName3' from dual
union all
select 'JAN', '2019', '4', 'EmpName4' from dual
union all
select 'JAN', '2019', '5', 'EmpName5' from dual
union all
select 'FEB', '2019', '1', 'EmpName1' from dual
union all
select 'FEB', '2019', '2', 'EmpName2' from dual
union all
select 'FEB', '2019', '3', 'EmpName3' from dual
union all
select 'FEB', '2019', '4', 'EmpName4' from dual
union all
select 'FEB', '2019', '5', 'EmpName5' from dual)
select 
mon,
y,
min(decode(rn, 1, nm, NULL)) Rank1 ,
min(decode(rn, 2, nm, NULL)) Rank2 ,
min(decode(rn, 3, nm, NULL)) Rank3 ,
min(decode(rn, 4, nm, NULL)) Rank4 ,
min(decode(rn, 5, nm, NULL)) Rank5 
from
 (
  select
  tbl.mon,
  tbl.y,
  tbl.rn,
  max(name) nm
  from
  tbl
  group by tbl.mon, tbl.y, tbl.rn
 )
group by mon, y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...