Persediaan Temu Duga SQL · Pelajaran

Menukar Lajur Menjadi Baris

Menterbalikkan jadual lebar dengan UNPIVOT atau UNION ALL.

Pelajaran 3 daripada 413 langkah

Menukar Lajur Menjadi Baris ialah pelajaran Persediaan Temu Duga SQL percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga SQL, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Masalah Terbalik

Nyahpemusingan ialah imej cermin pemusingan: Anda mengambil jadual lebar dan menukar lajurnya kembali menjadi baris. Penemuduga bertanya perkara ini apabila data tiba dalam bentuk hamparan tetapi perlu dinormalkan untuk analisis.

Contoh: jadual dengan lajur q1, q2, q3, q4 bagi setiap rantau mesti ditukar menjadi baris (region, quarter, amount). Bentuk panjang ini paling sesuai untuk pengagregatan, penggabungan dan pencartaan.

-- Wide input we want to unpivot
region | q1  | q2  | q3  | q4
-------+-----+-----+-----+----
East   | 100 | 150 | 120 | 180
West   | 200 | 250 | 210 | 260

Corak UNION ALL yang Mudah Alih

Jawapan yang tidak bergantung pada dialek ialah UNION ALL: tulis satu SELECT bagi setiap lajur sumber, dan setiap satunya mengeluarkan label harfiah serta nilai lajur tersebut.

Gunakan UNION ALL, bukan UNION, supaya Anda tidak menanggung kos penyahpenduaan dan dapat mengekalkan setiap baris, walaupun dua sel berkongsi nilai.

SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
UNION ALL
SELECT region, 'Q2', q2 FROM wide_sales
UNION ALL
SELECT region, 'Q3', q3 FROM wide_sales
UNION ALL
SELECT region, 'Q4', q4 FROM wide_sales;

Mengapa UNION ALL, Bukan UNION

Ini ialah perangkap temu duga klasik. UNION membuang baris pendua merentas keseluruhan hasil. Jika East dan West kedua-duanya mempunyai 100 untuk Q1, UNION biasa akan menggabungkan baris yang serupa dan Anda akan kehilangan data.

UNION ALL menggabungkan hasil tanpa membuang pendua, iaitu perkara yang diperlukan oleh nyahpemusingan. Ia juga lebih pantas kerana tidak memerlukan pengisihan atau cincangan untuk penyahpenduaan.

-- UNION would wrongly merge identical (region, quarter, amount) rows
-- UNION ALL keeps every row, always the correct choice here

Penyelarasan Jenis Lajur

Setiap cabang UNION ALL mesti menghasilkan bilangan lajur yang sama dengan jenis serasi dalam susunan yang sama. Nama lajur diambil daripada SELECT pertama.

Jika lajur lebar Anda berbeza jenis (katakan satu ialah int dan satu lagi decimal), enjin memilih jenis yang sama. Jika jenis tersebut benar-benar tidak serasi, tukarkan jenisnya secara jelas supaya kesatuan itu tidak gagal.

SELECT region, 'revenue' AS metric, CAST(revenue AS decimal(12,2)) AS val FROM t
UNION ALL
SELECT region, 'units',   CAST(units   AS decimal(12,2))        FROM t;

UNPIVOT SQL Server

SQL Server mempunyai operator UNPIVOT khusus yang lebih ringkas berbanding UNION ALL. Anda menamakan lajur nilai baharu, lajur label baharu dan menyenaraikan lajur sumber untuk dilipat.

Satu tingkah laku penting: UNPIVOT menggugurkan baris apabila nilainya NULL. Penemuduga menguji sama ada Anda mengetahui kesan sampingan ini.

SELECT region, quarter, amount
FROM wide_sales
UNPIVOT (
  amount FOR quarter IN (q1, q2, q3, q4)
) AS u;

UNPIVOT Menggugurkan NULL

Jika sesebuah rantau mempunyai NULL dalam q3, UNPIVOT SQL Server hanya meninggalkan baris itu daripada keluaran. Jika Anda memerlukan satu baris bagi setiap lajur tanpa mengira NULL, gunakan UNION ALL sebagai pilihan sandaran kerana ia mengekalkannya.

Nyatakan pertukaran ini dalam temu duga: UNPIVOT asli adalah ringkas tetapi menyebabkan kehilangan NULL; UNION ALL pula panjang tetapi lengkap.

-- UNPIVOT: q3 NULL for East -> no (East, Q3) row produced
-- UNION ALL: (East, 'Q3', NULL) row IS produced

PostgreSQL: LATERAL VALUES

PostgreSQL tidak mempunyai UNPIVOT, tetapi satu corak lazim yang kemas ialah CROSS JOIN LATERAL ke atas senarai VALUES. Setiap baris lebar dikembangkan terhadap jadual sebaris kecil yang mengandungi pasangan (label, nilai).

Ini lebih kemas berbanding UNION ALL yang panjang dan membaca jadual sumber hanya sekali.

SELECT w.region, v.quarter, v.amount
FROM wide_sales w
CROSS JOIN LATERAL (VALUES
  ('Q1', w.q1),
  ('Q2', w.q2),
  ('Q3', w.q3),
  ('Q4', w.q4)
) AS v(quarter, amount);

Membaca Jadual Sekali Sahaja

Satu perkara prestasi yang wajar dibangkitkan: UNION ALL naif mengimbas jadual lebar sekali bagi setiap cabang (empat imbasan untuk empat suku tahun). Bentuk LATERAL VALUES dan UNPIVOT SQL Server pula membaca sumber sekali sahaja.

Untuk jadual besar, perkara ini penting. Jika Anda mesti menggunakan UNION ALL, pengoptimum mungkin masih mengimbas berulang kali, jadi sebutkan LATERAL atau UNPIVOT sebagai pilihan yang lebih cekap.

Menapis Keluar Sel Kosong

Dengan UNION ALL atau LATERAL, Anda mengekalkan baris nilai NULL. Jika soalan hanya memerlukan sel yang berisi, tambahkan penapis. Ini meniru perkara yang dilakukan oleh UNPIVOT SQL Server secara automatik.

Keputusan untuk mengekalkan atau menggugurkan NULL bergantung pada pertimbangan, jadi jelaskan keperluan dengan penemuduga sebelum menulis kod.

SELECT region, quarter, amount
FROM (
  SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
  UNION ALL SELECT region, 'Q2', q2 FROM wide_sales
) t
WHERE amount IS NOT NULL;

Contoh Berpandu: Pengagregatan Selepas UNPIVOT

Soalan susulan yang biasa: "daripada jadual suku tahunan lebar, berikan jumlah hasil bagi setiap rantau merentas semua suku tahun." Selepas anda menyahpivot kepada bentuk panjang, pengagregatan menjadi mudah: satu SUM yang dikumpulkan mengikut rantau.

Ini menunjukkan sebab sebenar anda perlu menyahpivot terlebih dahulu. Menjumlahkan empat lajur berasingan adalah rapuh, tetapi SUM(amount) GROUP BY region dalam bentuk panjang boleh diskalakan kepada apa-apa bilangan suku tahun.

WITH long_sales AS (
  SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
  UNION ALL SELECT region, 'Q2', q2 FROM wide_sales
  UNION ALL SELECT region, 'Q3', q3 FROM wide_sales
  UNION ALL SELECT region, 'Q4', q4 FROM wide_sales
)
SELECT region, SUM(amount) AS total
FROM long_sales
GROUP BY region;

Bila Perlu Menyahpivot

Kenal pasti petunjuk nyahpivot dalam soalan berbentuk ayat:

  • Input mempunyai lajur berulang yang sebenarnya ialah nilai, seperti bulan, tahun dan metrik.
  • Anda perlu mengagregatkan, menggabungkan atau memplot carta merentas nilai tersebut.
  • Anda mahu menormalkan data hamparan yang tidak dinormalkan semasa pengimportan.

Bentuk panjang hampir selalu merupakan bentuk yang betul untuk kerja SQL seterusnya, jadi nyahpivot sering menjadi langkah pertama.

Semakan Pantas

Pastikan anda mengetahui perangkap nyahpivot yang paling biasa.

Ringkasan

Nyahpivot menukar lajur kepada baris:

  • Mudah alih: satu SELECT bagi setiap lajur yang digabungkan dengan UNION ALL (jangan gunakan UNION biasa).
  • SQL Server: UNPIVOT terbina dalam, ringkas tetapi menggugurkan nilai NULL.
  • Postgres: CROSS JOIN LATERAL (VALUES ...), dengan satu imbasan.
  • Selaraskan bilangan dan jenis lajur merentas cabang; tapis NULL jika soalan memerlukannya.
Percuma untuk bermula

Pelajari SQL dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
30
Pelajaran
120

Soalan Lazim

Adakah pelajaran “Menukar Lajur Menjadi Baris” percuma?

Ya — teks penuh “Menukar Lajur Menjadi Baris” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga SQL, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Menukar Lajur Menjadi Baris”?

Menterbalikkan jadual lebar dengan UNPIVOT atau UNION ALL. Anda berlatih Persediaan Temu Duga SQL menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga SQL?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga SQL di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Menukar Lajur Menjadi Baris” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga SQL ini?

Ya. Setiap pelajaran Persediaan Temu Duga SQL menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Memusing Data dengan Pengagregatan Bersyarat
  2. Sintaks PIVOT Vendor dan Jadual Silang
  3. Menukar Lajur Menjadi Baris
  4. PIVOT Dinamik dengan Lajur Tidak Diketahui
← Kembali ke Persediaan Temu Duga SQL