1
votes

Pivoter de ligne en colonne - Oracle SQL

J'ai une table:

Table1

row_id      var1        var2
1           123         456
2           665t        dsfs
3           sfs         sf

Voici la sortie:

Table2

row_id     var        var_val
1          Test 1      123
1          Test 2      456
1          Test 3      789
1          Test 4      1234
2          Test 1      665t
2          Test 2      dsfs
2          Test 3      df
2          Test 4      sfd
3          Test 1      sfs
3          Test 2      sf
3          Test 3      sdfs
3          Test 4      sfsd
  • Pour var1 - obtenir la valeur où var = "Test 1"
  • Pour var2 - obtenir la valeur où var = "Test 2"

Existe-t-il un moyen d'utiliser le pivot ou un moyen d'extraire la variable pour chaque row_id de la table1 comme ci-dessus?


3 commentaires

Modifiez votre question et affichez les résultats souhaités.


table2 est la sortie


Que contient la colonne var1 et var2? comment il est calculé?


3 Réponses :


1
votes

Vous pouvez utiliser une agrégation conditionnelle ou une join :

select t11.row_id, t11.var, t12.var
from table1 t11 join
     table1 t12
     on t11.row_id = t12.row_id and
        t11.var = 'Test 1' and
        t12.var = 'Test 2'


0 commentaires

0
votes

Existe-t-il un moyen d'utiliser le pivot ...?

Sûr:

select * 
  from table1
  pivot (max(var_val) for var in ('Test 1' var1, 'Test 2' var2))

démo


0 commentaires

0
votes

Vous pouvez utiliser ensemble la fonction d'analyse de fenêtre sous-requêtes corrélées et row_number ()

with table1(row_id, var, var_val) as
(
 select 1,'Test 1','123'  from dual union all
 select 1,'Test 2','456'  from dual union all
 select 1,'Test 3','789'  from dual union all
 select 1,'Test 4','1234' from dual union all
 select 2,'Test 1','665t' from dual union all
 select 2,'Test 2','dsfs' from dual union all
 select 2,'Test 3','df'   from dual union all
 select 2,'Test 4','sfd'  from dual union all
 select 3,'Test 1','sfs'  from dual union all
 select 3,'Test 2','sf'   from dual union all
 select 3,'Test 3','sdfs' from dual union all
 select 3,'Test 4','sfsd' from dual
), t2 as
(
select t.*, row_number() over (partition by var order by row_id) as rn
  from table1 t
)
select distinct row_id,
                (select var_val
                   from table1 t2
                  where t2.var = 'Test 1'
                    and t2.row_id = rn) as var1,
                (select var_val
                   from table1 t2
                  where t2.var = 'Test 2'
                    and t2.row_id = rn) as var2
  from t2
 order by row_id

 ROW_ID VAR1    VAR2
 ------ ----    ----
 1      123     456
 2      665t    dsfs
 3      sfs     sf

Démo


0 commentaires