Как развернуть один столбец выходной таблицы в sql?

Я новичок в кодировании и не понимаю функцию Pivot, просто хотел узнать, может ли кто-нибудь помочь мне с запросом ниже.

У меня есть SQL-запрос ниже

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'

Это дает результат, как показано ниже

POSITION_CODE    NAME
ABCD             Grade03
ABCD             Grade04
ABCD             Grade05

Но я хочу вывод, как показано ниже

POSITION_CODE    Grade1    Grade2    Grade3
ABCD             Grade03   Grade04   Grade05

Может ли кто-нибудь помочь мне с изменениями, которые мне нужно внести в мой SQL-запрос, и что произойдет, если у меня есть другой столбец, значение которого я хочу развернуть?

Спасибо,

Шивам

Вы говорите, что результат вашего запроса дает Grade03, Grade04 ,Grade05, но вы говорите, что вам нужно получить Grade01, Grade02, Grade03; это опечатка?

Aleksej 10.09.2018 10:14

Извините, что это опечатка, я отредактирую ..

shivam 10.09.2018 10:15
0
2
44
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

Вам может понадобиться:

-- 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
         )
       )

который дает:

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

Если вам нужно обработать еще несколько столбцов, вам нужно отредактировать свой код, потому что вам нужно заранее знать количество и имя столбцов вашего набора результатов:

-- 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
         )
       )

таким образом получая:

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

Значения «ABCD, Grade03, Grade04, Grade05» не являются постоянными и будут меняться каждый раз с другим position_code, который я жестко закодировал на данный момент. Будет ли этот запрос работать и в динамическом случае?

shivam 10.09.2018 10:34

Значение «ABCD» может варьироваться в зависимости от того, что вы хотите в этом примере, но значения «Grade03», «GRade04», .. не могут, потому что они используются в PIVOT. Возможно, вы захотите поискать какую-нибудь динамическую опору, вы найдете на этот счет несколько хороших ответов. Отправная точка

Aleksej 10.09.2018 10:41

Спасибо, можно ли этого добиться с помощью функции TRANSPOSE?

shivam 10.09.2018 11:08
Ответ принят как подходящий

Я решил свой вопрос от попадания и следа, ниже приведен код, надеюсь, он поможет другим.

    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

Спасибо,

Шивам

Другие вопросы по теме