1

ここで私の問題を説明しようとします。私は3つのテーブルを持っているとしましょう:

1.販売

  • 販売 ID (PK)
  • productID(FK) - 販売された製品を指す FK
  • storeID(FK) - 商品を販売したストアを指す FK
  • month - 商品が販売された月
  • year - 製品が販売された年
  • amount - 商品が販売された金額

2.製品

  • 製品 ID (PK)
  • 商品名

3.保管する

  • ストア ID (PK)
  • 店舗名

次のクエリが必要です:すべての店舗について、指定された年にその店舗で最も売れた製品を表示します。したがって、結果は次のようになります。

STORE    PRODUCT    AMOUNT
store1   product1   XXX amount
store2   product2   YYY amount
store3   product1   XYX amount

各金額は、その年のすべての金額の最高額になります。

私が今できることは次のとおりです。

  SELECT store.storeName
       , product.ProductName
       , SUM(sales.ammount)
    FROM sales
    JOIN product ON sales.productID = product.productID
    JOIN store   ON sales.storeID   = store.storeID
GROUP BY store.storeName
       , product.ProductName
   WHERE sales.year = 'XXXX'
       ;

製品ごとおよび店舗ごとの合計を取得する場所。この後、カーソルを使用してテーブル全体を行ごとに移動し、その店舗の金額が最も高いテーブルを確認できます。

しかし、「単純な」クエリでそれを行うことができるかどうか疑問に思っていましたか?

Oracle 11g データベースに SQL Developer を使用しています。そして、私は助けていただければ幸いです。

4

1 に答える 1

1

オラクルにはあま​​り詳しくありませんが、おそらく次のようなものです。

WITH cte AS (SELECT store.storeName
                   , product.ProductName
                   , SUM(sales.ammount) as sales_amount
              FROM sales
              JOIN product ON sales.productID = product.productID
              JOIN store ON sales.storeID = store.storeID
              WHERE sales.year = 'XXXX'                  
              GROUP BY store.storeName, product.ProductName
              )
SELECT a.*
FROM cte a
JOIN (SELECT storeName
            , MAX(sales_amount) as Max_Sales
      FROM cte
      GROUP BY storeName
      )b
  ON a.storeName = b.StoreName
  AND a.sales_amount = b.Max_Sales;

両方のエントリを返す同順位がある場合は、ROW_NUMBER()代わりに を使用して、 storeName ごとに 1 つの結果に制限できます。

于 2013-09-13T22:51:04.617 に答える