Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Linha dinâmica do MySQL em número dinâmico de colunas


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;