5

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

+-----+--------+-----------+----------+
| id  | type_id| product_id| date     |
+-----+--------+-----------+----------+
|  1  |   1    |   300     |22/01/2013|
|  2  |   1    |   800     |22/01/2013|
|  3  |   1    |   400     |30/01/2013|
|  4  |   1    |   300     |05/02/2013|
|  5  |   5    |   300     |27/02/2013|
|  6  |   1    |   300     |28/02/2013|
|  7  |   3    |   400     |12/03/2013|
|  8  |   5    |   400     |02/03/2013|
|  9  |   1    |   300     |06/03/2013|
| 10  |   1    |   400     |06/03/2013|
| 11  |   5    |   400     |06/03/2013|
| 12  |   1    |   400     |08/03/2013|

各製品グループの各タイプの月と年ごとのカウントを取得したい場合、これは可能ですか?私が求めている出力は、次のようなものになるはずです。

+-----------+------------+-------------+------------+------+------+
|product_id |count_type_1|count_type_3 |count_tyep_5| month| year |
+-----------+------------+-------------+------------+------+------+
| 300       |     1      |      0      |     0      |   01 | 2013 |
| 800       |     1      |      0      |     0      |   01 | 2013 |
| 400       |     1      |      0      |     0      |   01 | 2013 |
| 300       |     2      |      0      |     1      |   02 | 2013 |
| 300       |     1      |      0      |     0      |   03 | 2013 |
| 400       |     2      |      1      |     2      |   03 | 2013 | 

これは単一のSQLを使用して実現できますか?

PS:これはMYSQLサーバー上にあります

4

2 に答える 2

8

以下を使用して、集計関数と式を使用して各列を作成するデータをピボットできます。CASE

select 
  product_id,
  sum(case when type_id=1 then 1 else 0 end) count_type_1,
  sum(case when type_id=2 then 1 else 0 end) count_type_2,
  sum(case when type_id=3 then 1 else 0 end) count_type_3,
  sum(case when type_id=4 then 1 else 0 end) count_type_4,
  sum(case when type_id=5 then 1 else 0 end) count_type_5,
  month(date) month,
  year(date) year
from yourtable
group by product_id, month(date), year(date)

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

これにより、次の結果が得られます。

| PRODUCT_ID | COUNT_TYPE_1 | COUNT_TYPE_2 | COUNT_TYPE_3 | COUNT_TYPE_4 | COUNT_TYPE_5 | MONTH | YEAR |
--------------------------------------------------------------------------------------------------------
|        300 |            1 |            0 |            0 |            0 |            0 |     1 | 2013 |
|        300 |            2 |            0 |            0 |            0 |            1 |     2 | 2013 |
|        300 |            1 |            0 |            0 |            0 |            0 |     3 | 2013 |
|        400 |            1 |            0 |            0 |            0 |            0 |     1 | 2013 |
|        400 |            2 |            0 |            1 |            0 |            2 |     3 | 2013 |
|        800 |            1 |            0 |            0 |            0 |            0 |     1 | 2013 |
于 2013-02-04T23:25:34.010 に答える
6
SELECT
  product_id,
  COUNT(CASE WHEN type_id=1 THEN 1 END) count_type_1,
  COUNT(CASE WHEN type_id=2 THEN 1 END) count_type_2,
  COUNT(CASE WHEN type_id=3 THEN 1 END) count_type_3,
  COUNT(CASE WHEN type_id=4 THEN 1 END) count_type_4,
  COUNT(CASE WHEN type_id=5 THEN 1 END) count_type_5,
  MONTH(date) month,
  YEAR(date) year
FROM
  products
GROUP BY
  product_id,
  MONTH(date),
  YEAR(date)
于 2013-02-04T23:25:44.507 に答える