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

MySQL - Buat satu catatan dari kolom

Apa yang Anda minta pada dasarnya adalah PIVOT tetapi MySQL tidak memiliki fungsi pivot sehingga Anda dapat mereplikasi ini menggunakan CASE pernyataan dengan fungsi agregat.

Jika Anda mengetahui nilainya, maka Anda dapat membuat hard-code solusi yang mirip dengan ini:

select id,
  max(case when component_id = 1 then data end) Email,
  max(case when component_id = 2 then data end) Firstname,
  max(case when component_id = 3 then data end) Lastname,
  max(case when component_id = 4 then data end) Phone
from yourtable
group by id;

Lihat SQL Fiddle dengan Demo

Hasilnya adalah:

| ID |            EMAIL |  FIRSTNAME |  LASTNAME |  PHONE |
-----------------------------------------------------------
|  1 | [email protected] | firstname1 | lastname1 | phone1 |
|  2 |           email2 | firstname2 | lastname2 | phone2 |

Saya menduga Anda memiliki tabel untuk mengaitkan component_id dengan nama sehingga kueri Anda juga dapat berupa:

select t1.id,
  max(case when t2.name = 'email' then data end) Email,
  max(case when t2.name= 'FirstName' then data end) Firstname,
  max(case when t2.name= 'LastName' then data end) Lastname,
  max(case when t2.name= 'phone' then data end) Phone
from yourtable t1
inner join component t2
  on t1.component_id = t2.id 
group by t1.id;

Lihat SQL Fiddle dengan Demo

Jika Anda memiliki jumlah nilai yang tidak diketahui, Anda dapat menggunakan pernyataan yang disiapkan untuk menghasilkan kueri ini secara dinamis:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when name = ''',
      name,
      ''' then data end) AS ',
      name
    )
  ) INTO @sql
FROM component;

SET @sql = CONCAT('SELECT t1.id, ', @sql, ' 
                  from yourtable t1
                  inner join component t2
                    on t1.component_id = t2.id 
                  group by t1.id');

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

Lihat SQL Fiddle dengan Demo

Semua versi akan memberi Anda hasil yang sama.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql memeriksa susunan tabel

  2. mysql pilih nilai baris dinamis sebagai nama kolom, kolom lain sebagai nilai

  3. Bagaimana cara menghilangkan mode SQL STRICT di MySQL

  4. Menggunakan GROUP_CONCAT pada subquery di MySQL

  5. Bagaimana saya bisa menulis kueri indeks pencarian lengkap yang tidak akan mempertimbangkan stopwords apa pun?