SQL查询(每年最多金额)

时间:2013-09-13 22:39:42

标签: sql oracle sum max

我会尝试在这里描述我的问题。假设我有3张桌子:

1。销售

  • salesID(PK)
  • productID(FK) - 指向销售产品的FK
  • storeID(FK) - 指向销售产品的商店的FK
  • 月份 - 产品销售月份
  • 产品销售的年份
  • 金额 - 销售产品的金额(金钱)

2。产品

  • productID(PK)
  • 产品名称

3. 商店

  • storeID(PK)
  • STORENAME

我需要以下查询:每家商店都会在指定年份的商店中展示最畅销的产品。因此结果应如下所示:

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'
       ;

我获得每件商品和每家商店的总和。在此之后,我可以使用光标逐行遍历整个表格,并检查哪一个具有该商店的最高金额。

但我想知道是否可以在“简单”查询中执行此操作?

我正在使用SQL Developer for Oracle 11g数据库。 我将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:1)

对Oracle非常熟悉,但可能类似于:

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一个结果。