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.
3 Réponses :
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.
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
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;
En quoi est-ce différent de la réponse que Stew Ashton avait déjà publiée?