0
votes

Requête SQL pour convertir non. des rangées à no. de colonne à Oracle

J'ai besoin de convertir toutes les lignes en colonnes I.E. Nombre de colonnes = Total NO. des valeurs dans COL2 et COL3 liées au col1.

scénario

Entrez la description de l'image ici

Requête essayé: xxx

Comment puis-je écrire une requête pivot ici?


1 commentaires

La réponse que vous avez acceptée ne génère pas réellement la sortie que vous attendez.


3 Réponses :


0
votes

Utiliser Row_Number () CODE> et agrégation conditionnelle

select col1,
       max(case when rn=1 then col2 end) as col2,
       max(case when rn=2 then col2 end) as col3,
       max(case when rn=3 then col2 end) as col4,
       max(case when rn=1 then col3 end) as col5,
       max(case when rn=2 then col3 end) as col6,
       max(case when rn=3 then col3 end) as col7
from
(
select *, row_number() over(partition by col1 order by null) as rn
from tablename
)A group by col1


1 commentaires

Je ne pouvais pas comprendre. Pourquoi avoir voté cela et? Y a-t-il mal ici? Explication beaucoup plus appréciée



1
votes

Une approche pour gérer cela utilise une requête de pivot avec Row_Number : xxx

 Entrez la description de l'image ici

Démo


3 commentaires

Cela ne fonctionnera pas si 1 rang de plus est ajouté aux données. Ne pouvons-nous pas le rendre dynamique?


@Deep Oui, mais vous devrez probablement utiliser Dynamic Oracle SQL, qui signifie essentiellement à écrire du code qui génère lui-même la requête souhaitée.


Oui, à part PL / SQL, pouvons-nous faire cela? Comme si vous avez écrit du code dans Oracle SQL. Alors est-ce possible? Comme j'essaie et que je ne peux pas le faire fonctionner. J'ai d'abord utilisé Listagg pour créer la chaîne entière, puis veut les diviser à l'aide de Regex mais dans ce scénario, je dois également dire au nombre de colonnes. Il y a donc une façon de créer des colonnes dynamiques en fonction des données? Sélectionnez Listagg (Col2 || ':' || Col3, ':') Au sein du groupe (Commande par Col1) Liste, Compte (*) * 2 Nombre de CTE Group par Col1



1
votes
-- Oracle 11g+: pivot
with cte as  (
select 'A' as col1, 1  as col2, 2   as col3 from dual union all
select 'A' as col1, 3  as col2, 4   as col3 from dual union all
select 'A' as col1, 5  as col2, 6   as col3 from dual union all
select 'B' as col1, 10 as col2, 101 as col3 from dual union all
select 'B' as col1, 20 as col2, 202 as col3 from dual union all
select 'C' as col1, 50 as col2, 501 as col3 from dual union all
select 'C' as col1, 60 as col2, 601 as col3 from dual union all
select 'C' as col1, 70 as col2, 701 as col3 from dual )
select *
from
   (select t.*, row_number() over (partition by col1 order by col2) rn
    from cte t
   )
pivot (max(col2) as pc2, max(col3) as pc3 for rn in (1,2,3));

C      1_PC2      1_PC3      2_PC2      2_PC3      3_PC2      3_PC3
- ---------- ---------- ---------- ---------- ---------- ----------
A          1          2          3          4          5          6
B         10        101         20        202
C         50        501         60        601         70        701

0 commentaires