0

私はこのテーブルを持っています:

Month    Type
JAN        A
JAN        A
FEB        B
FEB        B
FEB        A
FEB        A

月ごとにグループ化し、その月のタイプの発生をカウントするクエリを実行したいと思います。
したがって、上記の表の場合、出力は次のようになります。

        A     B
JAN     2     0
FEB     2     2

それはおそらく不可能ですが、私はそれを試してみようと思いました。ありがとうございました。

4

2 に答える 2

3

残念ながら、MySQLには、PIVOT基本的に実行しようとしている機能がありません。CASEしたがって、次のステートメントで集計関数を使用する必要があります。

SELECT Month,
  SUM(case when type = 'A' then 1 ELSE 0 END) as A,
  SUM(case when type = 'B' then 1 ELSE 0 END) as B
FROM yourTable
GROUP BY month

デモで SQL Fiddle を参照してください

これを動的に実行する場合、つまり転置する列が事前にわからない場合は、次の記事を確認する必要があります。

動的ピボット テーブル (行を列に変換)

コードは次のようになります。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(case when type = ''',
      type,
      ''' then 1 ELSE 0 END) AS ',
      type
    )
  ) INTO @sql
FROM test;

SET @sql = CONCAT('SELECT month, ', @sql, ' FROM test GROUP BY month');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

デモで SQL Fiddle を参照してください

于 2012-08-24T22:29:33.613 に答える
1

SQL 自体だけを使用して可変数の列を指定することはできません。クエリでできる最善の方法は、 でグループ化してMonthからType:

SELECT COUNT(*)
FROM table
GROUP BY Month, Type

このようにして、次のようになります。

JAN   A   2
JAN   B   0
FEB   A   2
FEB   B   2

これは、任意のプログラミング言語で最小限の労力で (あなたの例のように) ピボット テーブルに変換または処理することができます。

于 2012-08-24T22:13:28.607 に答える