Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Pivot-Zeile in dynamische Anzahl von Spalten

Leider hat MySQL keinen PIVOT Funktion, die im Grunde das ist, was Sie versuchen zu tun. Sie müssen also eine Aggregatfunktion mit einem CASE verwenden Aussage:

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

Siehe SQL-Demo

Da Sie die Produkte nicht kennen, möchten Sie dies wahrscheinlich dynamisch durchführen. Dies kann mit vorbereiteten Anweisungen erfolgen.

Mit dynamischen Pivot-Tabellen (Zeilen in Spalten umwandeln) würde Ihr Code so aussehen:

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;

Siehe SQL-Demo

Es ist wahrscheinlich erwähnenswert, dass GROUP_CONCAT ist standardmäßig auf 1024 Byte begrenzt. Sie können dies umgehen, indem Sie es für die Dauer Ihres Verfahrens höher einstellen, dh. SET @@group_concat_max_len = 32000;