UNPIVOT-clausule
Van toepassing op: Databricks SQL Databricks Runtime 12.2 LTS en hoger.
Transformeert de rijen van de table_reference door groepen van columns naar rijen te draaien en de vermelde columnssamen te vouwen: een eerste, nieuwe column die de oorspronkelijke column groepsnamen (of hun alias) als valuesbevat. Dit column wordt gevolgd door een groep columns met de values van elke column groep.
Syntaxis
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 ] } [, ...] ) )
Parameters
-
Identificeert het onderwerp van de
UNPIVOT
bewerking. INCLUDE NULLS
ofEXCLUDE NULLS
Of u rijen wel of niet wilt uitfilteren in
NULL
devalue_column
. De standaardwaarde isEXCLUDE NULLS
.-
Een ongekwalificeerde column alias. Deze column zal de valuesvasthouden. Het type ech
value_column
is het minst gangbare type van de bijbehorendecolumn_name
column typen. -
Een niet-gekwalificeerde column alias. Deze column bevat de namen van de geroteerde
column_name
's of huncolumn_alias
's. Het typeunpivot_column
isSTRING
.In het geval van een multi-waarde
UNPIVOT
is de waarde de samenvoeging van de'_'
gescheidencolumn_name
s, als dat nietcolumn_alias
het geval is. -
Identificeert een column in een relatie die wordt teruggedraaid. De naam kan worden gekwalificeerd. Alle
column_name
s moeten een minst gangbaar type delen. -
Een optionele naam die wordt gebruikt in
unpivot_column
. -
Geeft desgewenst een label op voor de resulterende table. Als de
table_alias
column_identifier
bevat, moet hun aantal overeenkomen met het aantal columns geproduceerd doorUNPIVOT
.
Resultaat
Een tijdelijke table van de volgende vorm:
- Alle columns uit de
table_reference
behalve die genaamd alscolumn_name
s. - Het
unpivot_column
typeSTRING
. - De
value_column
s van de minst voorkomende typen van hun overeenkomendecolumn_name
s.
Voorbeelden
- 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;