2

私は以下のようなテーブルを持っています

 Date        |  Product      |  Qty
-------------|---------------|------
12-Dec-12    | reference1    | 1
14-Dec-12    | reference2    | 2
14-Dec-12    | reference1    | 3
1-Jan-13     | reference2    | 4
3-Jan-13     | reference2    | 5
3-Jan-13     | reference3    | 6

そして、クエリを通じて以下のように取得したいと思います

Product    | Dec 2012   | Jan 2013
===========|============|========== 
reference1 |    4       | 0
reference2 |    2       | 9
reference3 |    0       | 6

6 months私はすでにグループ化する方法を知っています。私の問題は、動的な列を作成する方法です(最後の、12 monthsまたはを選択できるようにしたいです24 months)。

4

1 に答える 1

4

データを行から列にピボットしようとしています。MySQL にはピボット関数がありませんが、集計関数を使用しCASEて結果を取得できます。

select product,
  sum(case when month(date) = 12 and year(date) = 2012 
           then qty else 0 end) Dec2012,
  sum(case when month(date) = 1 and year(date) = 2013 
           then qty else 0 end) Jan2013
from yourtable
group by product

SQL Fiddle with Demoを参照してください。

これは、サブクエリを使用して月-年の形式で日付を取得することもできます。

select product,
  sum(case when MonthYear = 'Dec_2012' then qty else 0 end) Dec2012,
  sum(case when MonthYear = 'Jan_2013' then qty else 0 end) Jan2013
from
(
  select product,
    date_format(date, '%b_%Y') MonthYear,
    qty
  from yourtable
) src
group by product;

SQL Fiddle with Demoを参照してください。

次に、日付のリストを動的に生成する場合、または返す日付の数が不明な場合は、準備済みステートメントを使用して動的 SQL を生成できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when MonthYear = ''',
      MonthYear,
      ''' then qty else 0 end) AS ',
      MonthYear
    )
  ) INTO @sql
FROM 
(
  select product,
    date_format(date, '%b_%Y') MonthYear,
    qty
  from yourtable
) src;

SET @sql = CONCAT('SELECT product, ', @sql, ' 
                   from
                   (
                    select product,
                      date_format(date, ''%b_%Y'') MonthYear,
                      qty
                    from yourtable
                   ) src
                   GROUP BY product');


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

SQL Fiddle with Demoを参照してください。3つすべてで結果が得られます。

|    PRODUCT | DEC_2012 | JAN_2013 |
------------------------------------
| reference1 |        4 |        0 |
| reference2 |        2 |        9 |
| reference3 |        0 |        6 |
于 2013-03-06T10:52:32.537 に答える