Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Reduza 19 colunas para 5 colunas


O que você está procurando é um simples PIVOT característica.

A única diferença é que você não quer pivot na coluna valor , mas possível na ordem das palavras-chave .

Aqui a consulta para dinamizar na ordem alfabética das palavras-chave.

Observe que as duas primeiras subconsultas produzem apenas os dados simplificados do seguinte modo:
CODPRO  CODRCA
------- ------
400JE   LOGIST
400JE   INDLEG
50EFJ10 TP    
50EFJ10 ESPVER
50EFJ10 AGRICU
50EFJ10 INDLEG
50EFJ10 LOGIST

A consulta calcula primeiro o número da linha usando a ordem do CODRCA e o pivot nele:
with PRO as (
select '400JE' CODPRO from dual union all
select '50EFJ10' CODPRO from dual),
RCA as (
select '400JE' CODPRO, 'LOGIST' CODRCA from dual union all
select '400JE' CODPRO, 'INDLEG' CODRCA from dual union all
select '50EFJ10' CODPRO, 'TP' CODRCA from dual union all
select '50EFJ10' CODPRO, 'ESPVER' CODRCA from dual union all
select '50EFJ10' CODPRO, 'AGRICU' CODRCA from dual union all
select '50EFJ10' CODPRO, 'INDLEG' CODRCA from dual union all
select '50EFJ10' CODPRO, 'LOGIST' CODRCA from dual),
rn as (
select PRO.CODPRO,RCA.CODRCA,
row_number() over (partition by PRO.CODPRO order by RCA.CODRCA) as rn
from PRO
join RCA on PRO.CODPRO = RCA.CODPRO)
select *
from rn
pivot (max(CODRCA)  CODRCA for (rn) in
(1 as "C1",
 2 as "C2",
 3 as "C3",
 4 as "C4",
 5 as "C5"))

resultado
CODPRO  C1_COD C2_COD C3_COD C4_COD C5_COD
------- ------ ------ ------ ------ ------
400JE   INDLEG LOGIST                     
50EFJ10 AGRICU ESPVER INDLEG LOGIST TP

Se você preferir outro logik de classificação adapte conforme necessário. Também adapte se precisar de nomes de coluna diferentes.