sql >> Database >  >> RDS >> Mysql

MySQL dynamische-pivot

Helaas heeft MySQL geen PIVOT functie, maar u kunt het modelleren met behulp van een aggregatiefunctie en een CASE uitspraak. Voor een dynamische versie moet u voorbereide verklaringen gebruiken:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when part_type = ''',
      part_type,
      ''' then part_id end) AS part_',
      part_type, '_id'
    )
  ) INTO @sql
FROM
  parts;
SET @sql = CONCAT('SELECT product_id, ', @sql, ' 
                  FROM parts 
                   GROUP BY product_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Zie SQL Fiddle met demo

Als u maar een paar kolommen had, kunt u een statische versie gebruiken:

select product_id,
  max(case when part_type ='A' then part_id end) as Part_A_Id,
  max(case when part_type ='B' then part_id end) as Part_B_Id
from parts
group by product_id


  1. Haal de maandnaam uit een datum in PostgreSQL

  2. Een speciaal netwerk configureren voor communicatie met beschikbaarheidsgroepen

  3. Retourneer de eerste maandag van elke maand in SQLite

  4. MySQL voorwaardelijk invoegen