7

次のような製品注文のテーブルを含むデータベースがあります。

order_id | prod_code | prod_color | size | quantity |  
-----------------------------------------------------
1          SHIRT       001          S      10
1          SHIRT       001          M      7
1          SHIRT       001          L      8
1          SHIRT       001          XL     1
1          SHIRT       995          S      2
1          SHIRT       995          M      1
1          SHIRT       995          L      0
1          SHIRT       995          XL     1
2          PANTS       ....

そして、次のような製品価格表:

prod_code | prod_color | price | currency
-----------------------------------------
SHIRT       001          10      EUR
SHIRT       001          9       USD
SHIRT       001          50      YEN
SHIRT       001          15      RUB
SHIRT       995          20      EUR
SHIRT       995          29      USD
SHIRT       995          100     YEN
SHIRT       995          45      RUB 
PANTS       ....  

私が取得したいのは、次のようなビューです (簡単にするために、order_id でフィルター処理されています)。

order_id | prod_code | prod_color | size | quantity | EUR | USD | YEN | RUB
---------------------------------------------------------------------------
1          SHIRT       001          S      10         10    9     50    15
1          SHIRT       001          M      7          10    9     50    15
1          SHIRT       001          L      8          10    9     50    15
1          SHIRT       001          XL     1          10    9     50    15
1          SHIRT       995          S      2          20    29    100   45
1          SHIRT       995          M      1          20    29    100   45
1          SHIRT       995          L      0          20    29    100   45
1          SHIRT       995          XL     1          20    29    100   45

私はすでにウェブとSOを調べており、何をする必要があるかを正確に示しているTHIS QUESTIONを見つけましたが、いくつかの変更を加えて考えています...

データベースでこのクエリを実行しようとしました:

SELECT o.order_id, o.prod_code, o.prod_color, o.size, o.quantity,
MAX(CASE WHEN p.currency = 'EUR' THEN p.price END) AS 'EUR',
MAX(CASE WHEN p.currency = 'USD' THEN p.price END) AS 'USD',
MAX(CASE WHEN p.currency = 'YEN' THEN p.price END) AS 'YEN',
MAX(CASE WHEN p.currency = 'RUB' THEN p.price END) AS 'RUB'
FROM products_order o JOIN products_prices p ON o.prod_code = p.prod_code
WHERE o.order_id = 1
GROUP BY o.order_id, o.prod_code, o.prod_color, o.size, o.quantity

すべての行について、列全体で見つかった MAX 値が価格列に返されます。したがって、[product_color = 001] と [product_color = 995] の両方で、価格は 20 EURO に等しくなります (001 の方が安い場合は、 10ユーロ!)

私もMAXなしで試しましたが、価格ごとに1行が表示され、多くのセルが空のままになります(その後、MAXが何に使用されるかを理解しました:D)。

私がやろうとしていることをする方法を知っていますか?すべての prod_color ではなく、単一の prod_color 内で MAX を使用するにはどうすればよいですか?

私が書いたことを理解していただければ幸いです。事前に感謝します。助けていただければ幸いです。

(もっと明確な説明が必要な場合は、質問してください。できるだけ早く返信します。

改めまして、よろしくお願いいたします

4

2 に答える 2

11

追加のJOIN条件を追加しました:AND o.prod_color = p.prod_color

http://sqlfiddle.com/#!5/fadad/5

SELECT
  o.order_id, o.prod_code, o.prod_color, o.size, o.quantity,
  MAX(CASE WHEN p.currency = 'EUR' THEN p.price END) AS 'EUR',
  MAX(CASE WHEN p.currency = 'USD' THEN p.price END) AS 'USD',
  MAX(CASE WHEN p.currency = 'YEN' THEN p.price END) AS 'YEN',
  MAX(CASE WHEN p.currency = 'RUB' THEN p.price END) AS 'RUB'

FROM products_order o
JOIN products_prices p
  ON o.prod_code = p.prod_code
 AND o.prod_color = p.prod_color /* this line is added */

WHERE o.order_id = '1'
GROUP BY
  o.order_id,
  o.prod_code,
  o.prod_color,
  o.size,
  o.quantity

のない簡略化されたクエリの例GROUP BYは、違いを示しています。

http://sqlfiddle.com/#!5/fadad/13

于 2012-08-03T17:31:14.120 に答える