sql >> Database teknologi >  >> RDS >> Mysql

SQL-forespørgsel til at genopbygge en tabel ved hjælp af dens dynamiske rækkedata til kolonnenavne

Dette er dybest set en PIVOT men MySQL har ikke PIVOT-funktion. Så du vil gerne replikere dette ved at bruge en aggregeret funktion og en CASE udmelding. Hvis du kender antallet af Grant værdier, som du har, så kan du hårdkode forespørgslen svarende til denne:

vælg 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) når `grant`='NIH' then subtotal else 0 end) NIH, sum(case when `grant`='NSF' then subtotal else 0 end) NSF, sum(case when `grant`='Andre' derefter subtotal else 0 slut) Andet, sum(tilfælde, når `grant`='State' derefter subtotal else 0 end) Statefrom yourtablegroup by month 

Se SQL Fiddle with Demo

Hvis du nu har et ukendt antal værdier for Grant , så kan du bruge en forberedt sætning til at generere en dynamisk version af denne forespørgsel:

SET @sql =NULL;SELECT GROUP_CONCAT(DISTINCT CONCAT( 'sum(case when `Grant` =''', `Grant`, ''' derefter Subtotal else 0 end) AS `', `Grant `, '`' ) ) INTO @sqlFROM yourtable;SET @sql =CONCAT('SELECT month, ', @sql, 'FROM yourtable group by month');PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt; 

Se SQL Fiddle with Demo

Begge giver det samme resultat:

| MÅNED | LUGE | NIH | NSF | ANDET | DOE | STATE |------------------------------------------------ ------------------| nov-2012 | 144,56 | 240,9 | 100,7 | 276,67 | 0 | 0 || okt-2012 | 321,54 | 0 | 234,53 | 312,35 | 214,35 | 0 || sep-2012 | 147,99 | 0 | 156,89 | 245,67 | 0 | 148,66 |


  1. Hvorfor får jeg ressource-id #4, når jeg anvender print_r() til et array i PHP?

  2. SQL hvor klausulen ikke virker

  3. Dvale Distinkt med rækkefølge efter

  4. At skabe et én til mange polymorfisk forhold til doktrin