Infelizmente o MySQL não tem um
PIVOT
função que é basicamente o que você está tentando fazer. Portanto, você precisará usar uma função agregada com um CASE
demonstração: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
Consulte Demonstração SQL
Como você não conhece os Produtos, provavelmente desejará fazer isso dinamicamente. Isso pode ser feito usando declarações preparadas.
Com tabelas dinâmicas (transforme linhas em colunas), seu código ficaria assim:
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;
Consulte Demonstração SQL
Provavelmente vale a pena notar que
GROUP_CONCAT
é por padrão limitado a 1024 bytes. Você pode contornar isso definindo-o mais alto para a duração do seu procedimento, ou seja. SET @@group_concat_max_len = 32000;