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

Pivot-Tabelle mit MySQL

Zum Drehen die Daten in MySQL, müssen Sie sowohl eine Aggregatfunktion als auch einen CASE verwenden Ausdruck.

Wenn Sie eine bekannte Anzahl von Spalten haben, können Sie die Abfrage fest codieren:

select p.postid,
  max(case when t.tagname = 'Incident' then p.value end) Incident,
  max(case when t.tagname = 'Location' then p.value end) Location,
  max(case when t.tagname = 'Weapon' then p.value end) Weapon
from triples p
left join tags t
  on p.tagid = t.id
group by p.postid;

Siehe SQL-Fiddle mit Demo

Wenn Sie jedoch eine unbekannte Anzahl von Spalten haben, müssen Sie eine vorbereitete Anweisung verwenden, um dynamisches SQL zu generieren:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(CASE WHEN TagName = ''',
      TagName,
      ''' THEN p.value END) AS `',
      TagName, '`'
    )
  ) INTO @sql
FROM tags;


SET @sql 
  = CONCAT('SELECT p.postid, ', @sql, ' 
           from triples p
           left join tags t
             on p.tagid = t.id
           group by p.postid');

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

Siehe SQL-Fiddle mit Demo .

Beide liefern das Ergebnis:

| POSTID | INCIDENT |      LOCATION | WEAPON |
----------------------------------------------
|      1 |   Murder | New Brunswick | (null) |
|      2 |    Theft |        (null) |    Gun |