To jest w zasadzie PIVOT
ale MySQL nie ma funkcji PIVOT. Więc będziesz chciał powtórzyć to za pomocą funkcji agregującej i CASE
oświadczenie. Jeśli znasz liczbę Grant
wartości, które posiadasz, możesz zakodować zapytanie w podobny sposób:
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
Zobacz Skrzypce SQL z wersją demonstracyjną
Teraz, jeśli masz nieznaną liczbę wartości dla Grant
, możesz użyć przygotowanej instrukcji do wygenerowania dynamicznej wersji tego zapytania:
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;
Zobacz SQL Fiddle z wersją demonstracyjną
Oba dają ten sam wynik:
| 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 |