عبارة 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 ] } [, ...] ) )

المعلمات

  • table_reference

    يحدد موضوع UNPIVOT العملية.

  • INCLUDE NULLS أو EXCLUDE NULLS

    ما إذا كنت تريد تصفية الصفوف أو عدم تصفيتها باستخدام NULL في value_column. الافتراضي هو EXCLUDE NULLS.

  • value_column

    اسم مستعار لعمود غير مؤهل. سيحتفظ هذا العمود بالقيم. نوع ech value_column هو النوع الأقل شيوعا من أنواع الأعمدة المقابلة column_name .

  • unpivot_column

    اسم مستعار لعمود غير مؤهل. سيحمل هذا العمود أسماء الأحرف التي تم column_nameتدويرها أو أسماءها column_alias. نوع unpivot_column هو STRING.

    في حالة وجود قيمة UNPIVOT متعددة، ستكون القيمة سلسلة s المفصولة '_'column_name، إذا لم يكن column_aliasهناك .

  • column_name

    تعريف عمود في العلاقة التي سيتم إلغاء محورها. قد يكون الاسم مؤهلا. يجب أن تشترك جميع column_names في نوع أقل شيوعا.

  • column_alias

    اسم اختياري مستخدم في unpivot_column.

  • table_alias

    يحدد اختياريا تسمية للجدول الناتج. إذا كان يتضمن table_aliascolumn_identifiers يجب أن يتطابق رقمها مع عدد الأعمدة التي ينتجها UNPIVOT.

نتيجة

جدول مؤقت للنموذج التالي:

  • جميع الأعمدة table_reference من باستثناء تلك المسماة ك column_names.
  • unpivot_column من النوع STRING.
  • s value_columnمن الأنواع الأقل شيوعا من مطابقة column_names.

الأمثلة

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