- Catégories :
PIVOT¶
Permet de faire pivoter une table en transformant les valeurs uniques d’une colonne de l’expression d’entrée en plusieurs colonnes et en agrégeant les résultats, le cas échéant, sur les valeurs d’une colonne restante. Dans une requête, il est spécifié dans la clause FROM après le nom de la table ou la sous-requête.
L’opérateur prend en charge les fonctions d’agrégat intégrées AVG, COUNT, MAX, MIN, et SUM.
PIVOT peut être utilisé pour transformer une table étroite (par exemple empid
, month
, sales
) en une table plus large (par exemple empid
, jan_sales
, feb_sales
, mar_sales
).
- Voir aussi :
Syntaxe¶
SELECT ...
FROM ...
PIVOT ( <aggregate_function> ( <pivot_column> )
FOR <value_column> IN ( <pivot_value_1> [ , <pivot_value_2> ... ] ) )
[ ... ]
aggregate_function
Fonction d’agrégation permettant de combiner les valeurs groupées à partir de
pivot_column
.pivot_column
La colonne de la table source ou de la sous-requête qui sera agrégée.
value_column
La colonne de la table source ou de la sous-requête contenant les valeurs à partir desquelles les noms de colonne seront générés.
pivot_value_N
Liste de valeurs permettant à la colonne pivot de pivoter dans les en-têtes des résultats de la requête.
Exemples¶
Dans une table monthly_sales
, avec la structure suivante, faites pivoter la colonne amount
pour faire la somme des ventes totales par employé pour les mois spécifiés :
CREATE OR REPLACE TABLE monthly_sales(empid INT, amount INT, month TEXT) AS SELECT * FROM VALUES (1, 10000, 'JAN'), (1, 400, 'JAN'), (2, 4500, 'JAN'), (2, 35000, 'JAN'), (1, 5000, 'FEB'), (1, 3000, 'FEB'), (2, 200, 'FEB'), (2, 90500, 'FEB'), (1, 6000, 'MAR'), (1, 5000, 'MAR'), (2, 2500, 'MAR'), (2, 9500, 'MAR'), (1, 8000, 'APR'), (1, 10000, 'APR'), (2, 800, 'APR'), (2, 4500, 'APR');Requête et sortie :
SELECT * FROM monthly_sales PIVOT(SUM(amount) FOR MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p ORDER BY EMPID; +-------+-------+-------+-------+-------+ | EMPID | 'JAN' | 'FEB' | 'MAR' | 'APR' | |-------+-------+-------+-------+-------| | 1 | 10400 | 8000 | 11000 | 18000 | | 2 | 39500 | 90700 | 12000 | 5300 | +-------+-------+-------+-------+-------+
Si vous préférez les noms de colonne sans guillemets ou si vous préférez que la sortie ait des noms de colonne différents de ceux de l’entrée, vous pouvez inclure les noms de colonne dans la clause AS, comme indiqué ci-dessous :
SELECT * FROM monthly_sales PIVOT(SUM(amount) FOR MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (EMP_ID_renamed, JAN, FEB, MAR, APR) ORDER BY EMP_ID_renamed; +----------------+-------+-------+-------+-------+ | EMP_ID_RENAMED | JAN | FEB | MAR | APR | |----------------+-------+-------+-------+-------| | 1 | 10400 | 8000 | 11000 | 18000 | | 2 | 39500 | 90700 | 12000 | 5300 | +----------------+-------+-------+-------+-------+
ou :
SELECT EMPID AS EMP_ID, "'JAN'" AS JANUARY, "'FEB'" AS FEBRUARY, "'MAR'" AS MARCH, "'APR'" AS APRIL FROM monthly_sales PIVOT(sum(amount) FOR MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p ORDER BY EMPID; +--------+---------+----------+-------+-------+ | EMP_ID | JANUARY | FEBRUARY | MARCH | APRIL | |--------+---------+----------+-------+-------| | 1 | 10400 | 8000 | 11000 | 18000 | | 2 | 39500 | 90700 | 12000 | 5300 | +--------+---------+----------+-------+-------+