sql >> Databasteknik >  >> RDS >> Mysql

SQL-fråga för att bygga om en tabell med dess dynamiska raddata för kolumnnamn

Detta är i grunden en PIVOT men MySQL har inte PIVOT-funktion. Så du kommer att vilja replikera detta med en aggregatfunktion och en CASE påstående. Om du känner till antalet Grant värden som du har så kan du hårdkoda frågan liknande denna:

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

Se SQL-fiol med demo

Om du nu har ett okänt antal värden för Grant , då kan du använda en förberedd sats för att generera en dynamisk version av denna fråga:

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;

Se SQL-fiol med demo

Båda ger samma resultat:

|    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 |



  1. Fyll i urvalsrutan från databasen med jQuery

  2. Hur man lagrar JSON-objekt i PostgreSQL med JSONB-datatyp i tabell och PostgreSQL JDBC-drivrutin

  3. hur använder man mysql now()-funktionen i cakephp för datumfält?

  4. Ta bort inledande nollor från ett fält i en SQL-sats