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 strong> p> Comment puis-je écrire une requête pivot ici? P> p>
3 Réponses :
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
Je ne pouvais pas comprendre. Pourquoi avoir voté cela et? Y a-t-il mal ici? Explication beaucoup plus appréciée
Une approche pour gérer cela utilise une requête de pivot avec Row_Number code>:
Démo h2>
p> p>
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 Code>
-- 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
La réponse que vous avez acceptée ne génère pas réellement la sortie que vous attendez.