Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara Transpose Baris ke Kolom Secara Dinamis di MySQL

Terkadang, data Anda mungkin disimpan dalam baris dan Anda mungkin ingin melaporkannya sebagai kolom. Dalam kasus seperti itu, Anda perlu mengubah urutan baris menjadi kolom. Terkadang, bahkan baris ini bisa menjadi variabel. Jadi Anda mungkin tahu berapa banyak kolom yang Anda butuhkan. Dalam kasus seperti itu, Anda perlu mentranspos baris ke kolom secara dinamis. Karena tidak ada fungsi bawaan untuk melakukan itu di MySQL, Anda harus menyelesaikannya menggunakan kueri SQL. Berikut adalah kueri SQL untuk secara dinamis mentranspos baris ke kolom di MySQL.

Cara Transpose Baris ke Kolom Secara Dinamis di MySQL

Berikut cara membuat tabel pivot dinamis di MySQL. Katakanlah Anda memiliki tabel berikut

CREATE TABLE Meeting
(
    ID INT,
    Meeting_id INT,
    field_key VARCHAR(100),
    field_value VARCHAR(100)
);

INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (1, 1,'first_name' , 'Alec');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (2, 1,'last_name' , 'Jones');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (3, 1,'occupation' , 'engineer');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (4,2,'first_name' , 'John');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (5,2,'last_name' , 'Doe');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (6,2,'occupation' , 'engineer');

+------+------------+------------+-------------+
| ID   | Meeting_id | field_key  | field_value |
+------+------------+------------+-------------+
|    1 |          1 | first_name | Alec        |
|    2 |          1 | last_name  | Jones       |
|    3 |          1 | occupation | engineer    |
|    4 |          2 | first_name | John        |
|    5 |          2 | last_name  | Doe         |
|    6 |          2 | occupation | engineer    |
+------+------------+------------+-------------+

Katakanlah Anda ingin mentranspos baris ke kolom secara dinamis, sehingga kolom baru dibuat untuk setiap nilai unik di field_key kolom, yaitu (nama_depan, nama_belakang, pekerjaan)

+------------+-------------+-------------+-------------+
| Meeting_id | first_name  |  last_name  |  occupation |
+------------+-------------+-------------+-------------+
|          1 |       Alec  | Jones       | engineer    |
|          2 |       John  | Doe         | engineer    |
+------------+-------------+-------------+-------------+

Transpose baris ke kolom secara dinamis

Jika Anda sudah mengetahui kolom mana yang akan Anda buat sebelumnya, Anda cukup menggunakan pernyataan CASE untuk membuat tabel pivot.

Karena kita tidak tahu kolom mana yang akan dibuat, kita harus secara dinamis mentranspos baris ke kolom menggunakan fungsi GROUP_CONCAT, seperti yang ditunjukkan di bawah ini

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when field_key = ''',
      field_key,
      ''' then field_value end) ',
      field_key
    )
  ) INTO @sql
FROM
  Meeting;
SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' 
                  FROM Meeting 
                   GROUP BY Meeting_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

GROUP_CONCAT memungkinkan Anda untuk menggabungkan nilai field_key dari beberapa baris menjadi satu string. Dalam kueri di atas, kami menggunakan GROUP_CONCAT untuk membuat pernyataan CASE secara dinamis, berdasarkan nilai unik di field_key kolom dan simpan string itu dalam variabel @sql, yang kemudian digunakan untuk membuat kueri pemilihan kami.

+------------+------------+-----------+------------+
| Meeting_id | first_name | last_name | occupation |
+------------+------------+-----------+------------+
|          1 | Alec       | Jones     | engineer   |
|          2 | John       | Doe       | engineer   |
+------------+------------+-----------+------------+

Ini adalah bagaimana Anda dapat mengotomatiskan kueri tabel pivot di MySQL dan mengubah urutan baris ke kolom secara dinamis.

Anda dapat menyesuaikan kueri di atas sesuai kebutuhan Anda dengan menambahkan klausa WHERE atau GABUNG.

Jika Anda ingin mengubah urutan hanya memilih nilai baris sebagai kolom, Anda dapat menambahkan klausa WHERE dalam pernyataan GROUP_CONCAT pilihan pertama Anda.

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when field_key = ''',
      field_key,
      ''' then field_value end) ',
      field_key
    )
  ) INTO @sql
FROM
  Meeting
WHERE <condition>;

Jika Anda ingin memfilter baris dalam tabel pivot akhir, Anda dapat menambahkan klausa WHERE dalam pernyataan SET.

SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' 
                  FROM Meeting WHERE <condition>
                   GROUP BY Meeting_id');

Demikian pula, Anda juga dapat menerapkan GABUNG dalam kueri SQL saat Anda mentranspos baris ke kolom secara dinamis di MySQL.

Berikut adalah contoh tabel pivot yang dibuat menggunakan Ubiq.

Jika Anda ingin membuat tabel pivot, grafik, dasbor &laporan dari database MySQL, Anda dapat mencoba Ubiq. Kami menawarkan uji coba gratis selama 14 hari.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ubah teks menjadi angka dalam kueri MySQL

  2. Memilih Baris Acak di MySQL

  3. Cara Melihat Koneksi Saat Ini di MySQL Workbench menggunakan GUI

  4. Terhubung ke database MySQL jarak jauh melalui SSH menggunakan Java

  5. Bagaimana saya bisa mengakses baris perintah MySQL dengan XAMPP untuk Windows?