sql >> Base de Datos >  >> RDS >> Mysql

Fila pivote de MySQL en un número dinámico de columnas

Desafortunadamente, MySQL no tiene un PIVOT función que es básicamente lo que está tratando de hacer. Por lo tanto, deberá usar una función agregada con un CASE declaración:

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 demostración de SQL

Dado que no conoce los Productos, probablemente querrá realizar esto de forma dinámica. Esto se puede hacer usando declaraciones preparadas.

Con tablas dinámicas dinámicas (transformar filas en columnas), su código se vería así:

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 demostración de SQL

Probablemente valga la pena señalar que GROUP_CONCAT por defecto está limitado a 1024 bytes. Puede evitar esto configurándolo más alto durante la duración de su procedimiento, es decir. SET @@group_concat_max_len = 32000;