1
votes

Décomposer (ou alternative) toutes les colonnes en lignes

J'ai les données suivantes:

c1 | 2000    | 2001    | 2002    | 2003
c2 | 1844054 | 1850861 | 1841519 | 1804163
c3 | 50.03   | 49.86   | 50.32   | 49.84
c4 | 922030  | 937391  | 907995  | 902838
c5 | 25.01   | 25.25   | 24.81   | 24.94

Je dois traduire les données de:

c1   | c2      | c3    | c4     | c5
2000 | 1844054 | 50.03 | 922030 | 25.01
2001 | 1850861 | 49.86 | 937391 | 25.25
2002 | 1841519 | 50.32 | 907995 | 24.81
2003 | 1804163 | 49.84 | 902838 | 24.94

vers:

XXX

Je n'ai pas réussi avec un PIVOT normal, donc je vous demande de l'aide, merci.


0 commentaires

3 Réponses :


1
votes

C'est une douleur. Vous pouvez annuler le pivot et le ré-agréger. Voici une méthode:

select which,
       max(case when year = 2000 then c end) as val_2000,
       max(case when year = 2001 then c end) as val_2001,
       max(case when year = 2002 then c end) as val_2002,
       max(case when year = 2003 then c end) as val_2003
from ((select c1 as year, 'c2' as which, c2 as c from test) union all
      (select c1 as year, 'c3' as which, c3 as c from test) union all
      (select c1 as year, 'c4' as which, c4 as c from test) union all
      (select c1 as year, 'c5' as which, c5 as c from test) 
     ) x
group by which
order by which;

Ici est un db violon.


0 commentaires

3
votes

Vous transposez, pas seulement pivotez. Vous devez UNPIVOT , puis PIVOT.

select * from test
unpivot(c for col in(c2,c3,c4,c5))
pivot(max(c) for c1 in(2000,2001,2002,2003))
order by col;

CO       2000       2001       2002       2003
-- ---------- ---------- ---------- ----------
C2    1844054    1850861    1841519    1804163
C3      50.03      49.86      50.32      49.84
C4     922030     937391     907995     902838
C5      25.01      25.25      24.81      24.94


0 commentaires

0
votes
 SELECT * FROM test
 unPIVOT(
    quantity -- unpivot_clause
    FOR product_code --  unpivot_for_clause
    IN ( c2,c3,c4,c5)) 

pivot(max(quantity) for 
c1 in(2000,2001,2002,2003))
order by product_code;

1 commentaires

En quoi est-ce différent de la réponse que Stew Ashton avait déjà publiée?