Clause UNPIVOT
S’applique à : Databricks SQL Databricks Runtime 12.2 LTS et versions ultérieures.
Transforme les lignes de table_reference en faisant pivoter des groupes de colonnes en lignes et en réduisant les colonnes répertoriées : une première nouvelle colonne contient les noms de groupes de colonnes d’origine (ou leurs alias) en tant que valeurs. Cette colonne est suivie pour un groupe de colonnes avec les valeurs de chaque groupe de colonnes.
Syntaxe
table_reference UNPIVOT [ { INCLUDE NULLS | EXCLUDE NULLS } ]
{ single_value | multi_value }
( value_column
FOR unpivot_column IN ( { column_name [ column_alias ] } [, ...] ) )
[ table_alias ]
single_value
( value_column
FOR unpivot_column IN ( { column_name [ column_alias ] } [, ...] ) )
multi_value
( ( value_column [, ...] )
FOR unpivot_column IN ( { ( column_name [, ...] ) [ column_alias ] } [, ...] ) )
Paramètres
-
Identifie le sujet de l’opération
UNPIVOT
. INCLUDE NULLS
ouEXCLUDE NULLS
Indique s’il faut filtrer ou non les lignes avec
NULL
dans levalue_column
. Par défaut, il s’agit deEXCLUDE NULLS
.-
Alias de colonne non qualifié. Cette colonne contient les valeurs. Le type de chaque
value_column
est le type le moins commun des types de colonnescolumn_name
correspondants. -
Alias de colonne non qualifié. Cette colonne contient les noms des
column_name
pivotés ou de leurscolumn_alias
. Le type deunpivot_column
estSTRING
.Dans le cas d’une valeur
UNPIVOT
multiple, la valeur sera la concaténation descolumn_name
séparés par'_'
, s’il n’y a pas decolumn_alias
. -
Identifie une colonne par rapport qui ne sera pas pivotée. Le nom peut être qualifié. Tous les
column_name
doivent partager un type le moins commun. -
Nom facultatif utilisé dans
unpivot_column
. -
Spécifie éventuellement une étiquette pour la table résultante. Si le
table_alias
inclutcolumn_identifier
, leur nombre doit correspondre au nombre de colonnes produites parUNPIVOT
.
Résultats
Une table temporaire au format suivant :
- Toutes les colonnes du
table_reference
, à l’exception de celles nommées en tant quecolumn_name
. - Le
unpivot_column
de typeSTRING
. - Les
value_column
des types les moins courants de leurscolumn_name
correspondants.
Exemples
- A single column UNPIVOT
> CREATE OR REPLACE TEMPORARY VIEW sales(location, year, q1, q2, q3, q4) AS
VALUES ('Toronto' , 2020, 100 , 80 , 70, 150),
('San Francisco', 2020, NULL, 20 , 50, 60),
('Toronto' , 2021, 110 , 90 , 80, 170),
('San Francisco', 2021, 70 , 120, 85, 105);
> SELECT *
FROM sales UNPIVOT INCLUDE NULLS
(sales FOR quarter IN (q1 AS `Jan-Mar`,
q2 AS `Apr-Jun`,
q3 AS `Jul-Sep`,
sales.q4 AS `Oct-Dec`));
location year quarter sales
—------------ —--- —------ —-----
Toronto 2020 Jan-Mar 100
Toronto 2020 Apr-Jun 80
Toronto 2020 Jul-Sep 70
Toronto 2020 Oct-Dec 150
San Francisco 2020 Jan-Mar null
San Francisco 2020 Apr-Jun 20
San Francisco 2020 Jul-Sep 50
San Francisco 2020 Oct-Dec 60
Toronto 2021 Jan-Mar 110
Toronto 2021 Apr-Jun 90
Toronto 2021 Jul-Sep 80
Toronto 2021 Oct-Dec 170
San Francisco 2021 Jan-Mar 70
San Francisco 2021 Apr-Jun 120
San Francisco 2021 Jul-Sep 85
San Francisco 2021 Oct-Dec 105
-- This is equivalent to:
> SELECT location, year,
inline(arrays_zip(array('Jan-Mar', 'Apr-Jun', 'Jul-Sep', 'Oct-Dec'),
array(q1 , q2 , q3 , q4)))
AS (quarter, sales)
FROM sales;
- A multi column UNPIVOT
> CREATE OR REPLACE TEMPORARY VIEW oncall
(year, week, area , name1 , email1 , phone1 , name2 , email2 , phone2) AS
VALUES (2022, 1 , 'frontend', 'Freddy', 'fred@alwaysup.org' , 15551234567, 'Fanny' , 'fanny@lwaysup.org' , 15552345678),
(2022, 1 , 'backend' , 'Boris' , 'boris@alwaysup.org', 15553456789, 'Boomer', 'boomer@lwaysup.org', 15554567890),
(2022, 2 , 'frontend', 'Franky', 'frank@lwaysup.org' , 15555678901, 'Fin' , 'fin@alwaysup.org' , 15556789012),
(2022, 2 , 'backend' , 'Bonny' , 'bonny@alwaysup.org', 15557890123, 'Bea' , 'bea@alwaysup.org' , 15558901234);
> SELECT *
FROM oncall UNPIVOT ((name, email, phone) FOR precedence IN ((name1, email1, phone1) AS primary,
(name2, email2, phone2) AS secondary));
year week area precedence name email phone
---- ---- -------- ---------- ------ ------------------ -----------
2022 1 frontend primary Freddy fred@alwaysup.org 15551234567
2022 1 frontend secondary Fanny fanny@lwaysup.org 15552345678
2022 1 backend primary Boris boris@alwaysup.org 15553456789
2022 1 backend secondary Boomer boomer@lwaysup.org 15554567890
2022 2 frontend primary Franky frank@lwaysup.org 15555678901
2022 2 frontend secondary Fin fin@alwaysup.org 15556789012
2022 2 backend primary Bonny bonny@alwaysup.org 15557890123
2022 2 backend secondary Bea bea@alwaysup.org 15558901234
-- This is equivalent to:
> SELECT year, week, area,
inline(arrays_zip(array('primary', 'secondary'),
array(name1, name2),
array(email1, email2),
array(phone1, phone2)))
AS (precedence, name, email, phone)
FROM oncall;