これは基本的にPIVOT
ただし、MySQLにはPIVOT機能がありません。したがって、集計関数とCASE
を使用してこれを複製する必要があります。 声明。 Grant
の数がわかっている場合 持っている値は、次のようにクエリをハードコーディングできます:
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
SQL Fiddle withDemo を参照してください。
ここで、Grant
の値の数が不明な場合 、次に、プリペアドステートメントを使用して、このクエリの動的バージョンを生成できます。
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;
SQL Fiddle withDemo を参照してください。
どちらも同じ結果になります:
| 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 |