- Catégories :
UNPIVOT¶
Fait pivoter une table en transformant des colonnes en lignes. UNPIVOT est un opérateur relationnel qui accepte deux colonnes (d’une table ou d’une sous-requête), ainsi qu’une liste de colonnes, et génère une ligne pour chaque colonne spécifiée dans la liste. Dans une requête, il est spécifié dans la clause FROM après le nom de la table ou la sous-requête.
Notez que UNPIVOT n’est pas exactement l’inverse de PIVOT car il ne peut pas annuler les agrégations effectuées par PIVOT.
Cet opérateur peut être utilisé pour transformer une table large (par exemple empid
, jan_sales
, feb_sales
, mar_sales
) en une table plus étroite (par exemple empid
, month
, sales
).
- Voir aussi :
Syntaxe¶
SELECT ...
FROM ...
UNPIVOT ( <value_column>
FOR <name_column> IN ( <column_list> ) )
[ ... ]
value_column
Nom à affecter à la colonne générée qui sera renseignée avec les valeurs des colonnes de la liste des colonnes.
name_column
Le nom à affecter à la colonne générée qui sera renseignée avec les noms des colonnes de la liste des colonnes.
column_list
Les noms de colonnes de la table ou de la sous-requête source qui seront réduites en une seule colonne pivot. Les noms de colonnes rempliront
name_column
et les valeurs de colonne remplirontvalue_column
.La
column_list
doit contenir uniquement des noms de colonne littéraux, pas une sous-requête.
Exemples¶
Avec une table monthly_sales
, la structure et les données suivantes, dépivotez les colonnes de mois individuelles pour renvoyer une seule valeur sales
par month
pour chaque employé :
-- example setup CREATE OR REPLACE TABLE monthly_sales(empid INT, dept TEXT, jan INT, feb INT, mar INT, april INT); INSERT INTO monthly_sales VALUES (1, 'electronics', 100, 200, 300, 100), (2, 'clothes', 100, 300, 150, 200), (3, 'cars', 200, 400, 100, 50); -- UNPIVOT example SELECT * FROM monthly_sales UNPIVOT(sales FOR month IN (jan, feb, mar, april)) ORDER BY empid; +-------+-------------+-------+-------+ | EMPID | DEPT | MONTH | SALES | |-------+-------------+-------+-------| | 1 | electronics | JAN | 100 | | 1 | electronics | FEB | 200 | | 1 | electronics | MAR | 300 | | 1 | electronics | APRIL | 100 | | 2 | clothes | JAN | 100 | | 2 | clothes | FEB | 300 | | 2 | clothes | MAR | 150 | | 2 | clothes | APRIL | 200 | | 3 | cars | JAN | 200 | | 3 | cars | FEB | 400 | | 3 | cars | MAR | 100 | | 3 | cars | APRIL | 50 | +-------+-------------+-------+-------+