sql >> Databasteknik >  >> RDS >> Mysql

MySQL dynamisk pivot

Tyvärr har MySQL ingen PIVOT funktion men du kan modellera den med en aggregerad funktion och en CASE påstående. För en dynamisk version måste du använda förberedda satser:

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;

Se SQL fiffla med demo

Om du bara hade ett fåtal kolumner kan du använda en statisk version:

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. Hur får man genererade nycklar från JDBC batchinlägg i Oracle?

  2. Hur man använder CASE Statement i MySQL?

  3. Hur kan jag stoppa ett Postgres-skript när det stöter på ett fel?

  4. 2 sätt att formatera ett tal med ledande nollor i Oracle