sql >> Databáze >  >> RDS >> Oracle

Zmenšete 19 sloupců na 5 sloupců

Co hledáte, jednoduchý PIVOT funkce.

Jediný rozdíl je, že nechcete pivot ve sloupci hodnota , ale možné v pořadí klíčových slov .

Zde je dotaz, který se má přesunout podle abecedního pořadí klíčových slov.

Upozorňujeme, že první dva dílčí dotazy vytvářejí pouze zjednodušená data takto:

CODPRO  CODRCA
------- ------
400JE   LOGIST
400JE   INDLEG
50EFJ10 TP    
50EFJ10 ESPVER
50EFJ10 AGRICU
50EFJ10 INDLEG
50EFJ10 LOGIST

Dotaz nejprve vypočítá číslo řádku pomocí pořadí CODRCA a pivot na to:

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

výsledek

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

Pokud preferujete jinou logiku řazení přizpůsobte podle potřeby. Přizpůsobte se také, pokud potřebujete jiné názvy sloupců.



  1. MySQL používá názvy sloupců z jiné tabulky

  2. MySQL Levenshtein

  3. PostgreSQL 9.5 - aktualizace nefunguje při sloučení NULL s JSON

  4. Použijte primární klíč citlivý na zvýraznění v MySQL