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
Lepaskan: 2025-01-09 14:57:41
asal
807 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan