2017-03-28 11 views
0

によって、私は私のオラクルDB注文オラクル - グループで最も頻繁にエントリー

CLIENT_ID - PRODUCT_ID - ORDER_PRICE 
     1   1   50 
     2   3   60 
     3   2   70 
     4   2   70 

製品リストの一つの

PRODUCT_ID - PRODUCT_NAME - PRODUCT_PRICE 
    1   P_1   50 
    2   P_2   60 
    3   P_3   70 
    4   P_4   80 

そして、もう一つ上の2つのテーブルを持っている私がする必要がありますproduct_listテーブルを返すようにクエリを作成しますが、ordersテーブル内の最も頻繁なProduct_idで順序付けします。この場合、プロダクトID = 2がリストの先頭になければなりません。

私はいくつかの例を見つけましたが、このケースではうまくいくものが見つかりません。

+0

MySQLとOracleの両方を使用していますか?そうでない場合は、いずれかのタグを削除してください。 (ええ、MySQLはOracleが所有していますが、そのためには[mysql]のみを使用してください)。 –

答えて

1

ordersテーブルの集計にサブクエリを使用して、各製品IDのカウントを検索し、product_listテーブルに結合して、計算されたカウントを注文に使用することができます。

select p.* 
from product_list p 
left join (
    select product_id, 
     count(*) as cnt 
    from orders 
    group by product_id 
    ) o on p.product_id = o.product_id 
order by o.cnt desc nulls last; 
1
  • LEFTはないすべての製品は、注文を持つことができ、我々は、各製品の注文の数を見つける必要があるために使用されましょう。
  • GROUP BYは、集計count()を使用して、指定されたProductの注文の発生を検出するために使用されます。
  • ORDER BY DESCが使用されているため、カウントは最初から最低の注文数の高い順に並べられます。しかし、ネクタイが存在する場合、第2レベルの注文として返される注文は定義されていません。注文できる可能性があります。Product_IDを追加して、それ以降は低い値から高い値にすることができます。

SELECT PL.Product_ID, PL.Product_Name, PL.Product_Price, count(O.Product_ID) cnt 
FROM Product_List 
LEFT JOIN Orders O 
    on O.Product_ID = PL.Product_ID 
GROUP BY PL.Product_ID, PL.Product_Name, PL.Product_Price 
ORDER BY cnt Desc 
関連する問題