Bonjour,
Je souhaite réaliser un pivot de deux colonnes en SQL SERVER v.15, mais je n'y parviens pas. Enfin presque, j'ai trouvé des solutions, mais je n'aime pas la façon dont je l'ai codé, je suis persuadé que l'on peut réaliser cela bien mieux.
J'ai bien entendu chercher sur Internet, mais ne suis pas parvenu à trouver de réponse (ou alors, je ne suis pas doué).
J'explique ma problématique :
J'ai la table suivante :
Alimentée comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 create table TB ( PRODUIT CHAR(3) not null , ANNEE INT not null , QTE INT not null , COUT INT not null ) ;
Et je voudrais obtenir ceci :
Avec les instructions suivantes, je parviens à réaliser le pivot d'une seule colonne mais séparément :
En solution, je peux concaténer QTE et COUT pour réaliser le pivot et les déconcaténer ensuite, ça fait le job, mais c'est pas terrible en qualité de codage.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 select PRODUIT , max( [2021] ) as QTE_ANNEE_1 , max( [2022] ) as QTE_ANNEE_2 , max( [2023] ) as QTE_ANNEE_3 from ( select PRODUIT , ANNEE , QTE , COUT from TB ) as DONNEES_SOURCES pivot ( max( QTE ) for ANNEE in ( [2021] , [2022] , [2023] ) ) as PIVOT_QTE group by PRODUIT ; select PRODUIT , max( [2021] ) as COUT_ANNEE_1 , max( [2022] ) as COUT_ANNEE_2 , max( [2023] ) as COUT_ANNEE_3 from ( select PRODUIT , ANNEE , QTE , COUT from TB ) as DONNEES_SOURCES pivot ( max( COUT ) for ANNEE in ( [2021] , [2022] , [2023] ) ) as PIVOT_COUT group by PRODUIT ;
J'ai aussi trouvé une solution en imbriquant le premier pivot en source du second comme ceci :
Mais je ne suis pas encore satisfait, J'aimerai réaliser quelque chose qui ressemble à ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 select PRODUIT , max( COUT_ANNEE_1 ) as COUT_ANNEE_1 , max( COUT_ANNEE_2 ) as COUT_ANNEE_2 , max( COUT_ANNEE_3 ) as COUT_ANNEE_3 , max( [2021] ) as QTE_ANNEE_1 , max( [2022] ) as QTE_ANNEE_2 , max( [2023] ) as QTE_ANNEE_3 from ( select PRODUIT , ANNEE_2 , QTE , max( [2021] ) as COUT_ANNEE_1 , max( [2022] ) as COUT_ANNEE_2 , max( [2023] ) as COUT_ANNEE_3 from ( select PRODUIT , ANNEE as ANNEE_1 , ANNEE as ANNEE_2 , QTE , COUT from TB ) as DONNEES_SOURCES_1 pivot ( max( COUT ) for ANNEE_1 in ( [2021] , [2022] , [2023] ) ) as PIVOT_COUT group by PRODUIT , ANNEE_2 , QTE ) as DONNEES_SOURCES_2 pivot ( max( QTE ) for ANNEE_2 in ( [2021] , [2022] , [2023] ) ) as PIVOT_QTE group by PRODUIT ;
Bien entendu, ça ne fonctionne pas. Auriez-vous une idée, SVP ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 select PRODUIT , max( PIVOT_QTE.[2021] ) as QTE_ANNEE_1 , max( PIVOT_QTE.[2022] ) as QTE_ANNEE_2 , max( PIVOT_QTE.[2023] ) as QTE_ANNEE_3 , max( PIVOT_COUT.[2021] ) as COUT_ANNEE_1 , max( PIVOT_COUT.[2022] ) as COUT_ANNEE_2 , max( PIVOT_COUT.[2023] ) as COUT_ANNEE_3 from ( select PRODUIT , ANNEE , QTE , COUT from TB ) as DONNEES_SOURCES pivot ( max( QTE ) for ANNEE in ( [2021] , [2022] , [2023] ) ) as PIVOT_QTE pivot ( max( COUT ) for ANNEE in ( [2021] , [2022] , [2023] ) ) as PIVOT_COUT group by PRODUIT ;
D'avance Merci de l'attention que vous porterez à ma demande.
Cordialement,
GiDu
Partager