0

私はこの価格表を持っています

type | year | price
===================
A    | 2002 | 200
B    | 2002 | 120
C    | 2002 | 126
B    | 1999 | 100
A    | 2004 | 202
A    | 2005 | 206

SELECTタイプの価格の2次元配列を生成するためのクエリが必要でありA、指定されたタイプのデータがない場合Bは毎年表示されます。NULL

year | price A | price B
========================
1999 | NULL    | 100
2002 | 200     | 120
2004 | 202     | NULL
2005 | 206     | NULL
4

2 に答える 2

2

これは基本的にはですPIVOTが、MySQL には関数がないため、集計関数PIVOTを含むステートメントを使用して複製できます。CASE値の数がわかっている場合は、type値をハードコーディングできます。

select year,
  avg(case when type='A' then price end) PriceA,
  avg(case when type='B' then price end) PriceB
from yourtable
group by year

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

結果:

| YEAR | PRICEA | PRICEB |
--------------------------
| 1999 | (null) |    100 |
| 2002 |    200 |    120 |
| 2004 |    202 | (null) |
| 2005 |    206 | (null) |

不明な数がある場合はtypes、準備済みステートメントを使用できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'avg(case when type = ''',
      type,
      ''' then price end) AS Price',
      type
    )
  ) INTO @sql
FROM yourtable;

SET @sql = CONCAT('SELECT year, ', @sql, ' 
                  FROM yourtable 
                   GROUP BY year');

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

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

于 2012-11-27T16:03:20.250 に答える
1

コメントに答える


次の回答は、ピボットにのみ回答しています-OPの質問の一部 集計関数を使用していないため、クエリは集計OPの予想される出力に対する完全な回答を提供していません。

リファレンスをチェックしてください:)

SQLFIDDLE

クエリ:

SELECT t.year,
         (CASE WHEN t.type = 'A' 
               THEN PRICE ELSE NULL END) AS price_a,
         (CASE WHEN t.type = 'B' 
               THEN PRICE ELSE NULL END) AS prioce_b         
FROM tbl t
GROUP BY t.year
;

結果:

YEAR    PRICE_A     PRIOCE_B
1999    (null)     100
2002    200       (null)
2004    202       (null)
2005    206       (null)
于 2012-11-27T16:10:10.023 に答える