1

私の既存のテーブルは次のようなものです:

ID付与小計月
1 ハッチ 144.56 2012 年 11 月
2 NIH 240.9 2012 年 11 月
3 NSF 100.7 2012 年 11 月
4 その他 276.67 2012 年 11 月
5 NSF 234.53 2012 年 10 月
6 DOE 214.35 2012 年 10 月
7 ハッチ 321.54 2012 年 10 月
8 その他 312.35 2012 年 10 月
9 NSF 156.89 2012 年 9 月
10 ハッチ 147.99 2012 年 9 月
11 その他 245.67 2012年9月
12 州 148.66 2012 年 9 月

この表は、各助成金の毎月の費用を示しています。時間が経つにつれて、行番号が増加しています。grant 列内では、ほとんどの場合、名前は同じままです。新しい助成金が利用可能になると、ここに表示されます。これはあまり頻繁には発生しません。

ここで、グラフのデータをプロットして、各助成金の毎月の支出額を人々が確認できるようにしたいと考えています。この目的のために、次のようにテーブルを再形成したいと思います。

ID 月 DOE ハッチ NIH NSF その他の州
1 2012 年 11 月 144.56 240.9 100.7 276.67  
2 2012 年 10 月 214.35 321.54 234.53 312.35  
3 2012 年 9 月 147.99 156.89 245.67 148.66

目的の新しいテーブルは列 Month (個別) を保持しますが、元のテーブルの Grant 列 (個別) のすべてのデータ値を列名 (動的) として使用します。これらの新しい列は、小計列の対応するデータ値をデータとして取得します。

誰かがクエリの作成を手伝ってくれませんか? どうもありがとう。

ところで: 私は MySQL/PHP を使用しています。私は初心者です。サンプルコードは高く評価されます。

4

1 に答える 1

1

これは基本的にです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 を参照してください

の値の数が不明な場合は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 を参照してください

どちらも同じ結果になります。

|    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 |
于 2012-11-12T18:36:16.573 に答える