2

次のようなテーブルがあります...

id           price             condition         sell
21039        20.40             new               0 
21039        20.41             used              1
12378        10.40             new               1
12378        5                 used              0
45898        30.30             new               1
45898        12.20             used              0

:IDごとに1つの新しい値と使用される値のみが存在します)

私がやろうとしているのは、同じID番号を持つすべての行をグループ化することですが、その過程で、条件ごとに新しい列を作成します。これは次のようになります...

id           new_price         new_sell          used_price         new_sell
21039        20.40             0                 20.41              1
12378        10.40             1                 5                  0
45898        30.30             1                 12.20              0

私が思いついたのは次のクエリだけですが、これはばかげているように見えます

SELECT id, price, condition, 
IF(price > 3, 1, 0)  AS sell
FROM products 
GROUP BY id 

2番目のテーブルの望ましい効果を得るにはどうすればよいですか。

4

1 に答える 1

3

これは、ピボットテーブルと呼ばれます。これは、CASE生成する必要のある各列の一連のステートメントと、集計MAX()またはSUM()NULLを削除して、単一の行に折りたたむことで実行されます。

SELECT
  id,
  SUM(CASE WHEN `condition` = 'new' THEN price ELSE 0 END) AS new_price,
  SUM(CASE WHEN `condition` = 'new' THEN sell ELSE 0 END) AS new_sell,
  SUM(CASE WHEN `condition` = 'used' THEN price ELSE 0 END) AS used_price,
  SUM(CASE WHEN `condition` = 'used' THEN sell ELSE 0 END) AS used_sell
FROM 
  products
GROUP BY id

とがなくてSUM()GROUP BY、ごとに2行が取得idされ、それぞれの列の半分(で一致しないconditionCASEがとして表示されNULLます。集計関数は行を。でグループ化するときにNULL値を除外するため、(この場合も使用できます)はNULLを削除し、1つの行を生成しSUM()ます。MAX()GROUP BYid

これがSQLFiddle.comの作業サンプルです

コメント後に更新:

sellに基づいて計算するには、ステートメントpriceの条件を置き換えるだけです。sell CASE

SELECT
  id,
  SUM(CASE WHEN `condition` = 'new' THEN price ELSE 0 END) AS new_price,
  SUM(CASE WHEN `condition` = 'new' AND price > 3 THEN 1 ELSE 0 END) AS new_sell,
  SUM(CASE WHEN `condition` = 'used' THEN price ELSE 0 END) AS used_price,
  SUM(CASE WHEN `condition` = 'used' AND price > 3 THEN 1 ELSE 0 END) AS used_sell
FROM 
  products
GROUP BY id

更新されたサンプル...

于 2012-11-28T02:40:07.937 に答える