عبارة UNPIVOT
ينطبق على: Databricks SQL Databricks Runtime 12.2 LTS وما فوق.
تحويل صفوف table_reference عن طريق تدوير مجموعات الأعمدة إلى صفوف وطي الأعمدة المدرجة: يحتوي العمود الجديد الأول على أسماء مجموعة الأعمدة الأصلية (أو الاسم المستعار هناك) كقيم، ويتم اتباع هذا العمود لمجموعة من الأعمدة بقيم كل مجموعة أعمدة.
بناء الجملة
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 ] } [, ...] ) )
المعلمات
-
يحدد موضوع
UNPIVOT
العملية. INCLUDE NULLS
أوEXCLUDE NULLS
ما إذا كنت تريد تصفية الصفوف أو عدم تصفيتها باستخدام
NULL
فيvalue_column
. الافتراضي هوEXCLUDE NULLS
.-
اسم مستعار لعمود غير مؤهل. سيحتفظ هذا العمود بالقيم. نوع ech
value_column
هو النوع الأقل شيوعا من أنواع الأعمدة المقابلةcolumn_name
. -
اسم مستعار لعمود غير مؤهل. سيحمل هذا العمود أسماء الأحرف التي تم
column_name
تدويرها أو أسماءهاcolumn_alias
. نوعunpivot_column
هوSTRING
.في حالة وجود قيمة
UNPIVOT
متعددة، ستكون القيمة سلسلة s المفصولة'_'
column_name
، إذا لم يكنcolumn_alias
هناك . -
تعريف عمود في العلاقة التي سيتم إلغاء محورها. قد يكون الاسم مؤهلا. يجب أن تشترك جميع
column_name
s في نوع أقل شيوعا. -
اسم اختياري مستخدم في
unpivot_column
. -
يحدد اختياريا تسمية للجدول الناتج. إذا كان يتضمن
table_alias
column_identifier
s يجب أن يتطابق رقمها مع عدد الأعمدة التي ينتجهاUNPIVOT
.
نتيجة
جدول مؤقت للنموذج التالي:
- جميع الأعمدة
table_reference
من باستثناء تلك المسماة كcolumn_name
s. unpivot_column
من النوعSTRING
.- s
value_column
من الأنواع الأقل شيوعا من مطابقةcolumn_name
s.
الأمثلة
- 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;