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

Baris pivot MySQL menjadi jumlah kolom dinamis

Sayangnya MySQL tidak memiliki PIVOT fungsi yang pada dasarnya adalah apa yang Anda coba lakukan. Jadi, Anda perlu menggunakan fungsi agregat dengan CASE pernyataan:

select pt.partner_name,
  count(case when pd.product_name = 'Product A' THEN 1 END) ProductA,
  count(case when pd.product_name = 'Product B' THEN 1 END) ProductB,
  count(case when pd.product_name = 'Product C' THEN 1 END) ProductC,
  count(case when pd.product_name = 'Product D' THEN 1 END) ProductD,
  count(case when pd.product_name = 'Product E' THEN 1 END) ProductE
from partners pt
left join sales s
  on pt.part_id = s.partner_id
left join products pd
  on s.product_id = pd.prod_id
group by pt.partner_name

Lihat Demo SQL

Karena Anda tidak mengetahui Produk, Anda mungkin ingin melakukan ini secara dinamis. Ini dapat dilakukan dengan menggunakan pernyataan yang disiapkan.

Dengan tabel pivot dinamis (mengubah baris menjadi kolom) kode Anda akan terlihat seperti ini:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'count(case when Product_Name = ''',
      Product_Name,
      ''' then 1 end) AS ',
      replace(Product_Name, ' ', '')
    )
  ) INTO @sql
from products;

SET @sql = CONCAT('SELECT pt.partner_name, ', @sql, ' from partners pt
left join sales s
  on pt.part_id = s.partner_id
left join products pd
  on s.product_id = pd.prod_id
group by pt.partner_name');

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

Lihat Demo SQL

Mungkin perlu diperhatikan bahwa GROUP_CONCAT secara default dibatasi hingga 1024 byte. Anda dapat menyiasatinya dengan menyetelnya lebih tinggi selama durasi prosedur Anda, mis. SET @@group_concat_max_len = 32000;




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Mendapatkan Bulan dari Tanggal di MySQL

  2. MySQL DROP DATABASE

  3. Mana yang tercepat? PILIH SQL_CALC_FOUND_ROWS FROM `table`, atau SELECT COUNT(*)

  4. TIMESTAMPADD() Contoh – MySQL

  5. Apakah ada opsi/fitur MySQL untuk melacak riwayat perubahan pada catatan?