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> ) )

[ ... ]
Copy
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 rempliront value_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 |
+-------+-------------+-------+-------+
Copy