Catégories :

Syntaxe de requête

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 :

PIVOT

Syntaxe

SELECT ...
FROM ...
   UNPIVOT ( <value_column>
             FOR <name_column> IN ( <column_list> ) )

[ ... ]
colonne_valeur

Nom à affecter à la colonne générée qui sera renseignée avec les valeurs des colonnes de la liste des colonnes.

colonne_nom

Le nom à affecter à la colonne générée qui sera renseignée avec les noms des colonnes de la liste des colonnes.

liste_colonne

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 nom_colonne et les valeurs de colonne rempliront colonne_valeur.

La liste_colonne 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 |
+-------+-------------+-------+-------+