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

SQL-Abfrage zum Neuerstellen einer Tabelle unter Verwendung ihrer dynamischen Zeilendaten für Spaltennamen

Dies ist im Grunde ein PIVOT aber MySQL hat keine PIVOT-Funktion. Sie sollten dies also mit einer Aggregatfunktion und einem CASE replizieren Aussage. Wenn Sie die Nummer von Grant kennen Werten, die Sie haben, können Sie die Abfrage ähnlich wie folgt fest codieren:

select 
  Month,
  sum(case when `grant`='DOE' then subtotal else 0 end) DOE,
  sum(case when `grant`='Hatch' then subtotal else 0 end) Hatch,
  sum(case when `grant`='NIH' then subtotal else 0 end) NIH,
  sum(case when `grant`='NSF' then subtotal else 0 end) NSF,
  sum(case when `grant`='Other' then subtotal else 0 end) Other,
  sum(case when `grant`='State' then subtotal else 0 end) State
from yourtable
group by month

Siehe SQL-Geige mit Demo

Wenn Sie nun eine unbekannte Anzahl von Werten für Grant haben , dann können Sie eine vorbereitete Anweisung verwenden, um eine dynamische Version dieser Abfrage zu generieren:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when `Grant` = ''',
      `Grant`,
      ''' then Subtotal else 0 end) AS `',
      `Grant`, '`'
    )
  ) INTO @sql
FROM yourtable;


SET @sql = CONCAT('SELECT month, ', @sql, ' 
                  FROM yourtable 
                  group by month');


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

Siehe SQL-Fiddle mit Demo

Beide erzeugen das gleiche Ergebnis:

|    MONTH |  HATCH |   NIH |    NSF |  OTHER |    DOE |  STATE |
-----------------------------------------------------------------
| Nov-2012 | 144.56 | 240.9 |  100.7 | 276.67 |      0 |      0 |
| Oct-2012 | 321.54 |     0 | 234.53 | 312.35 | 214.35 |      0 |
| Sep-2012 | 147.99 |     0 | 156.89 | 245.67 |      0 | 148.66 |