Bagikan melalui


klausa UNPIVOT

Berlaku untuk:centang ditandai ya Databricks SQL centang ditandai ya Databricks Runtime 12.2 LTS ke atas.

Mengubah baris dari referensi tabel sebelumnya dengan memutar grup kolom menjadi baris dan menggabungkan kolom yang tercantum: Kolom baru pertama menyimpan nama grup kolom asli (atau alias dari nama-nama tersebut) sebagai nilai. Kolom ini diikuti oleh sekelompok kolom dengan nilai dari masing-masing grup kolom.

Sintaks

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 ] } [, ...] ) )

Parameter

  • INCLUDE NULLS atau EXCLUDE NULLS

    Apakah, atau tidak untuk memfilter baris dengan NULL di value_column. Default adalah EXCLUDE NULLS.

  • value_column

    Alias kolom yang tidak terdefinisi. Kolom ini akan menyimpan nilai-nilai. Jenis ech value_column adalah jenis yang paling jarang ditemui di antara jenis-jenis kolom column_name yang sesuai.

  • unpivot_column

    Alias kolom yang tidak terdefinisi. Kolom ini akan menyimpan nama-nama column_nameyang diputar atau nama-nama column_aliasmereka. Jenis unpivot_column adalah STRING.

    Dalam kasus multi nilai UNPIVOT , nilai akan menjadi perangkaian dari s yang dipisahkan '_'column_name, jika tidak column_aliasada .

  • column_name

    Mengidentifikasi kolom dalam relasi yang akan dibuka pivot-nya. Nama mungkin memenuhi syarat. Semua column_nameharus berbagi jenis yang paling tidak umum.

  • column_alias

    Nama opsional yang digunakan dalam unpivot_column.

  • table_alias

    Secara opsional menentukan label untuk tabel yang dihasilkan. Jika table_alias menyertakan column_identifierjumlahnya harus cocok dengan jumlah kolom yang dihasilkan oleh UNPIVOT.

Hasil

Tabel sementara dari formulir berikut:

  • Semua kolom dari table_reference kecuali yang dinamai sebagai column_names.
  • Jenis unpivot_columnSTRING.
  • Dari value_columnjenis pencocokan column_nameyang paling tidak umum.

Contoh

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