Soy nuevo en la codificación y no entiendo la función Pivot solo quería saber si alguien me puede ayudar con la consulta a continuación.

Tengo una consulta SQL a continuación

select distinct hapf.position_code, pg.name
from
hr_all_positions_f hapf, PER_VALID_GRADES_F pvgf, per_grades pg
where
hapf.position_id = pvgf.position_id
and pvgf.grade_id = pg.grade_id
and hapf.position_code = 'ABCD'

Esto da una salida de la siguiente manera

POSITION_CODE    NAME
ABCD             Grade03
ABCD             Grade04
ABCD             Grade05

Pero quiero salida como a continuación

POSITION_CODE    Grade1    Grade2    Grade3
ABCD             Grade03   Grade04   Grade05

¿Alguien puede ayudarme con los cambios que necesito hacer en mi consulta SQL y qué sucede si tengo otra columna cuyo valor quiero pivotar?

Gracias

Shivam

0
shivam 10 sep. 2018 a las 11:07

3 respuestas

La mejor respuesta

Resolví mi pregunta de hit and trail, a continuación se muestra el código espero que ayude a otros.

    select position_code,
max(case when position_num = 1 and pg_num = 1 then grade_name end) as Grade1,
max(case when position_num = 1 and pg_num = 2 then grade_name end) as Grade2,
max(case when position_num = 1 and pg_num = 3 then grade_name end) as Grade3
from
(
select 
dense_rank() over (order by hapf.position_code) position_num,
dense_rank() over (partition by hapf.position_code order by pg.name) pg_num,
hapf.position_code, 
pg.name as grade_name
from
hr_all_positions_f hapf, PER_VALID_GRADES_F pvgf, per_grades pg
where
hapf.position_id = pvgf.position_id
and pvgf.grade_id = pg.grade_id
and hapf.position_code = 'ABCD'
) group by position_code

Gracias

Shivam

0
shivam 12 sep. 2018 a las 10:57

Tu puedes necesitar:

-- test case
with yourQuery (POSITION_CODE, NAME) as (
    select 'ABCD', 'Grade01' from dual union all
    select 'ABCD', 'Grade02' from dual union all
    select 'ABCD', 'Grade03' from dual
)
-- query
select *
from yourQuery
pivot ( max (Name) for name in
        (
            'Grade01' as Grade1,
            'Grade02' as Grade2,
            'Grade03' as Grade3
         )
       )

Que da:

POSITION_CODE GRADE1  GRADE2  GRADE3 
------------- ------- ------- -------
ABCD          Grade01 Grade02 Grade03

Si necesita manejar algunas columnas más, debe editar su código, porque necesita saber de antemano el número y el nombre de las columnas de su conjunto de resultados:

-- test case
with yourQuery (POSITION_CODE, NAME) as (
    select 'ABCD', 'Grade01' from dual union all
    select 'ABCD', 'Grade02' from dual union all
    select 'ABCD', 'Grade03' from dual union all
    select 'ABCD', 'Grade04' from dual
)
-- query
select *
from yourQuery
pivot ( max (Name) for name in
        (
            'Grade01' as Grade1,
            'Grade02' as Grade2,
            'Grade03' as Grade3,
            'Grade04' as Grade4
         )
       )

Obteniendo así:

POSITION_CODE GRADE1  GRADE2  GRADE3  GRADE4 
------------- ------- ------- ------- -------
ABCD          Grade01 Grade02 Grade03 Grade04
1
Aleksej 10 sep. 2018 a las 08:18
SELECT POSITION_CODE, Grade03,Grade04,Grade05 FROM   
(SELECT POSITION_CODE, NAME, Value_TO_PIVOT FROM mytable)Tab1  
PIVOT  
(  
SUM(Value_TO_PIVOT) FOR NAME IN (Grade03,Grade04,Grade05)) AS Tab2  
ORDER BY Tab2.POSITION_CODE

Puede consultar este enlace para escribir una consulta dinámica que será necesaria si no conoce los valores sobre los que desea pivotar o si los valores son más

0
Vinuthna V 10 sep. 2018 a las 08:18