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;