Samedi 3 avril 6 03 /04 /Avr 14:03

 

Il est souvent difficile depuis SQL de faire un tableau de données qui soit exploitable directement après extraction.

 

SQL permet de récupérer les données en lignes mais plus difficilement de les transposer en colonne dans un tableau.

 

Depuis la version 11g d'Oracle il existe une fonction bien sympathique pour nous aider, il s'agit de la fonction PIVOT.

 

 

Prenons comme exemple la table COMMANDE avec les colonnes suivantes :

 

COMMANDE_ID DATE_LIVRAISON CLIENT_ID ARTICLE_ID
1 01/04/2010 1  A1
2 01/04/2010 1  C5
3 01/04/2010 2  R4
4 02/04/2010 1  R4
5 03/04/2010 3  F8

 

 

On souhaite faire un rapport pour avoir le nombre d'articles commandés par jour de livraison et par client ayant la forme suivante :

 

DATE_LIVRAISON CLIENT 1
CLIENT 2
CLIENT 3
01/04/2010 2
1
0
02/04/2010 1
 0  0
03/04/2010 0
 0  1

 

 

Une solution consisterait à faire :

SELECT DATE_LIVRAISON, CLIENT_ID, COUNT(ARTICLE_ID)
FROM  COMMANDE
GROUP BY DATE_LIVRAISON, CLIENT_ID

 

et à utiliser des DECODE pour mettre le tableau en forme.

 

 

Mais bon maintenant on peut faire ça plus facilement et plus rapidement.

SELECT * FROM (
    SELECT DATE_LIVRAISON, CLIENT_ID, ARTICLE_ID
)
 PIVOT ( count(ARTICLE_ID)
    FOR CLIENT_IDIN ( 1 AS "CLIENT_1", 2 AS "CLIENT_2", 3 AS "CLIENT_3")
)

Et voilà, le tour est joué !

 

Le PIVOT doit utiliser une fonction comme COUNT ou SUM pour être utiliser.

 

Pour plus d'informations vous pouvez toujours regarder la description de la fonction PIVOT sur le site d'Oracle.

 

 

Astuce : il existe aussi la fonction UNPIVOT qui permet de faire le contraire, autrement dit passer d'un tableau à un rapport en ligne.

Par Nicolas - Publié dans : SQL
Ecrire un commentaire - Voir les 0 commentaires
Retour à l'accueil

Calendrier

Juillet 2014
L M M J V S D
  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 26 27
28 29 30 31      
<< < > >>

Recherche

Présentation

Créer un Blog

Créer un blog gratuit sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus