sql >> Databasteknik >  >> RDS >> Mysql

MySQL pivotrad till dynamiskt antal kolumner

Tyvärr har MySQL ingen PIVOT funktion som i princip är vad du försöker göra. Så du kommer att behöva använda en aggregatfunktion med en CASE uttalande:

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

Se SQL-demo

Eftersom du inte känner till produkterna kommer du förmodligen att vilja utföra detta dynamiskt. Detta kan göras med hjälp av förberedda uttalanden.

Med dynamiska pivottabeller (omvandla rader till kolumner) skulle din kod se ut så här:

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;

Se SQL-demo

Det är förmodligen värt att notera att GROUP_CONCAT är som standard begränsad till 1024 byte. Du kan komma runt detta genom att sätta det högre under hela din procedur, dvs. SET @@group_concat_max_len = 32000;




  1. Lagra bild till databas blob; hämta från db till Picturebox

  2. PostgreSQL Index vs InnoDB Index - Förstå skillnaderna

  3. Förstå Big Data Analytics

  4. Hur gör jag databastransaktioner med psycopg2/python db api?