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 :

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
) ;
Alimentée comme ceci :

Nom : Table.jpg
Affichages : 132
Taille : 20,6 Ko

Et je voudrais obtenir ceci :

Nom : Table_pivotee.jpg
Affichages : 132
Taille : 21,8 Ko

Avec les instructions suivantes, je parviens à réaliser le pivot d'une seule colonne mais séparément :

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 ;
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.

J'ai aussi trouvé une solution en imbriquant le premier pivot en source du second comme 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 ;
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
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 ;
Bien entendu, ça ne fonctionne pas. Auriez-vous une idée, SVP ?

D'avance Merci de l'attention que vous porterez à ma demande.

Cordialement,

GiDu