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