Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Pivot Lajur ke Baris dalam MySQL untuk Pelaporan?

Bagaimana untuk Pivot Lajur ke Baris dalam MySQL untuk Pelaporan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-09 14:57:41759semak imbas

How to Pivot Columns into Rows in MySQL for Reporting?

MySQL Pivot: Tukar lajur kepada baris

Dalam pangkalan data hubungan seperti MySQL, data selalunya perlu diubah untuk tujuan pelaporan. Satu transformasi sedemikian melibatkan penukaran lajur kepada baris, satu proses yang dipanggil "pangsi". Teknik ini membolehkan perwakilan data yang lebih fleksibel dan ringkas.

Soalan:

Pertimbangkan jadual MySQL berikut:

<code class="language-sql">CREATE TABLE mytable (
  id INT, 
  month VARCHAR(3), 
  col1 VARCHAR(1), 
  col2 VARCHAR(1), 
  col3 VARCHAR(1), 
  col4 VARCHAR(1)
);

INSERT INTO mytable (id, month, col1, col2, col3, col4) VALUES
(101, 'Jan', 'A', 'B', NULL, 'B'),
(102, 'Feb', 'C', 'A', 'G', 'E');</code>

Matlamatnya ialah untuk membuat laporan yang memaparkan nilai dari col1 hingga col4 sebagai baris dan bulan Jan dan Feb sebagai lajur.

Penyelesaian:

MySQL tidak menyediakan fungsi terbina dalam untuk menyahpangsi atau memutar data. Walau bagaimanapun, kita boleh mensimulasikan operasi ini menggunakan UNION ALL dan agregat dengan ungkapan CASE.

1. Anti-perspektif:

Untuk menyahpaut data, kami mencipta subkueri baharu yang menggunakan UNION ALL untuk menggabungkan baris daripada semua lajur menjadi satu lajur:

<code class="language-sql">SELECT id, month, col1 AS `value`, 'col1' AS `descrip`
UNION ALL
SELECT id, month, col2 AS `value`, 'col2' AS `descrip`
UNION ALL
SELECT id, month, col3 AS `value`, 'col3' AS `descrip`
UNION ALL
SELECT id, month, col4 AS `value`, 'col4' AS `descrip`
FROM mytable;</code>

2. Perspektif:

Seterusnya, kami membalut pertanyaan unpivot dalam subkueri dan menggunakan agregat dan penyata CASE untuk mengubah data ke dalam format yang diperlukan:

<code class="language-sql">SELECT descrip, 
  MAX(CASE WHEN month = 'Jan' THEN `value` ELSE NULL END) AS Jan,
  MAX(CASE WHEN month = 'Feb' THEN `value` ELSE NULL END) AS Feb
FROM (
  SELECT id, month, `value`, descrip
  FROM (
    SELECT id, month, col1 AS `value`, 'col1' AS `descrip`
    UNION ALL
    SELECT id, month, col2 AS `value`, 'col2' AS `descrip`
    UNION ALL
    SELECT id, month, col3 AS `value`, 'col3' AS `descrip`
    UNION ALL
    SELECT id, month, col4 AS `value`, 'col4' AS `descrip`
    FROM mytable
  ) AS unpivoted
) AS src
GROUP BY descrip;</code>

Keputusan:

Descrip Jan Feb
col1 A C
col2 B A
col3 NULL G
col4 B E

Nota: Tukar ELSE 0 END kepada ELSE NULL END untuk menjadikan hasil lebih konsisten dengan spesifikasi pangkalan data dan mengelakkan nilai 0 yang tidak diperlukan.

Atas ialah kandungan terperinci Bagaimana untuk Pivot Lajur ke Baris dalam MySQL untuk Pelaporan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn