Това е основно PIVOT
но MySQL няма функция PIVOT. Така че ще искате да копирате това с помощта на агрегатна функция и CASE
изявление. Ако знаете номера на Grant
стойности, които имате, тогава можете да кодирате твърдо заявката, подобно на това:
изберете месец, сума (случай, когато `grant`='DOE' след това междинна сума else 0 край) DOE, сума (случай, когато `grant`='Hatch' след това междинна сума else 0 край) Hatch, sum(case когато `grant`='NIH' тогава междинна сума else 0 край) NIH, сума (случай, когато `grant`='NSF' след това междинна сума else 0 край) NSF, сума (случай, когато `grant`='Друго' тогава междинна сума else 0 край) Друго, сума (случай, когато `grant`='State' тогава междинна сума else 0 край) Състояние от вашата група таблици по месец
Вижте SQL Fiddle с демонстрация
Сега, ако имате неизвестен брой стойности за Grant
, тогава можете да използвате подготвен израз, за да генерирате динамична версия на тази заявка:
SET @sql =NULL;SELECT GROUP_CONCAT(DISTINCT CONCAT( 'sum(case when `Grant` =''', `Grant`, ''' then Subtotal else 0 end) AS `', `Grant `, '`' ) ) INTO @sqlFROM yourtable;SET @sql =CONCAT('SELECT month, ', @sql, ' FROM yourtable group by months');PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;код>
Вижте SQL Fiddle с демонстрация
И двете дават един и същ резултат:
<предварителен код>| МЕСЕЦ | ЛЮК | NIH | NSF | ДРУГИ | DOE | ДЪРЖАВА |------------------------------------------------ ------------------| ноември-2012 | 144,56 | 240,9 | 100,7 | 276,67 | 0 | 0 || октомври-2012 | 321,54 | 0 | 234,53 | 312,35 | 214.35 | 0 || септември-2012 | 147,99 | 0 | 156,89 | 245,67 | 0 | 148.66 |