Le pivotement en SQL est une technique puissante pour transformer les données de lignes en colonnes. Cette méthode est souvent utilisée pour créer des rapports et des analyses, rendant les données plus lisibles et facilitant des calculs spécifiques. Cet article vous expliquera comment utiliser le pivotement en SQL avec des exemples concrets.
Qu’est-ce que le Pivotement ?
Le pivotement (ou “pivoting”) permet de réorganiser les données de manière à ce que les valeurs d’une colonne soient transposées en en-têtes de colonnes. Cela peut être très utile pour des tableaux de bord ou des rapports où vous voulez comparer différentes catégories côte à côte.
Exemple de Table de Ventes
Imaginons que nous avons une table de ventes (Sales
) avec les données suivantes :
ProductID | Month | SalesAmount |
---|---|---|
1 | January | 100 |
1 | February | 150 |
1 | March | 200 |
2 | January | 80 |
2 | February | 120 |
2 | March | 160 |
Nous souhaitons transformer cette table pour afficher les ventes de chaque produit par mois sous forme de colonnes.
SQL Standard (sans PIVOT)
Pour des systèmes SQL ne supportant pas directement le mot clé PIVOT
, vous pouvez utiliser des agrégations conditionnelles pour accomplir un pivotement :
SELECT
ProductID,
SUM(CASE WHEN Month = 'January' THEN SalesAmount ELSE 0 END) AS January,
SUM(CASE WHEN Month = 'February' THEN SalesAmount ELSE 0 END) AS February,
SUM(CASE WHEN Month = 'March' THEN SalesAmount ELSE 0 END) AS March
FROM
Sales
GROUP BY
ProductID;
Utilisation de PIVOT
en SQL Server
SQL Server fournit un mot clé PIVOT
qui simplifie le processus. Voici comment l’utiliser :
SELECT
ProductID,
January,
February,
March
FROM
(SELECT ProductID, Month, SalesAmount FROM Sales) AS SourceTable
PIVOT
(
SUM(SalesAmount)
FOR Month IN (January, February, March)
) AS PivotTable;
Utilisation de PIVOT
en Oracle
En Oracle, la syntaxe PIVOT
est légèrement différente :
SELECT *
FROM
(SELECT ProductID, Month, SalesAmount FROM Sales)
PIVOT
(
SUM(SalesAmount)
FOR Month IN ('January' AS January, 'February' AS February, 'March' AS March)
);
Utilisation de PIVOT
en PostgreSQL
PostgreSQL ne supporte pas directement le mot clé PIVOT
, mais vous pouvez obtenir un résultat similaire avec l’extension crosstab
fournie par le module tablefunc
:
CREATE EXTENSION IF NOT EXISTS tablefunc;
SELECT *
FROM crosstab(
'SELECT ProductID, Month, SalesAmount FROM Sales ORDER BY 1,2',
'VALUES (''January''), (''February''), (''March'')'
) AS ct (ProductID INT, January INT, February INT, March INT);
Pourquoi Utiliser SUM(SalesAmount)
?
La fonction SUM(SalesAmount)
est cruciale car elle permet d’agréger les données lors du pivotement. Elle calcule la somme des ventes (SalesAmount
) pour chaque combinaison de ProductID
et de Month
. Cela garantit que chaque cellule de la table pivotée contient la somme totale des ventes pour le mois et le produit spécifiés, rendant ainsi les données plus lisibles et exploitables.
Exemple Complet
Reprenons notre exemple de table avec des ventes multiples pour le même produit et le même mois :
ProductID | Month | SalesAmount |
---|---|---|
1 | January | 100 |
1 | January | 50 |
1 | February | 150 |
1 | February | 100 |
1 | March | 200 |
2 | January | 80 |
2 | January | 20 |
2 | February | 120 |
2 | March | 160 |
Après agrégation par somme :
ProductID | Month | TotalSalesAmount |
---|---|---|
1 | January | 150 |
1 | February | 250 |
1 | March | 200 |
2 | January | 100 |
2 | February | 120 |
2 | March | 160 |
En utilisant le pivotement, nous obtenons :
ProductID | January | February | March |
---|---|---|---|
1 | 150 | 250 | 200 |
2 | 100 | 120 | 160 |
La fonction SUM(SalesAmount)
permet donc de s’assurer que chaque cellule de la table pivotée contient la somme correcte des ventes pour chaque combinaison de produit et de mois.