【问题标题】:SQL Query (max of sum per year)SQL 查询(每年最大总和)
【发布时间】:2013-09-13 22:39:42
【问题描述】:

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

1. 销售

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

2. 产品

  • 产品ID (PK)
  • 产品名称

3. 商店

  • storeID (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'
       ;

我从每个产品和每个商店中获得一笔款项。在此之后,我可以使用光标逐行遍历整个表格,并检查哪个商店的金额最高。

但我想知道是否可以在“简单”查询中做到这一点?

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

【问题讨论】:

    标签: sql oracle sum max


    【解决方案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 一个结果。

    【讨论】:

    • @a_horse_with_no_name sales_amount = SUM(sales.amount) 在 oracle 中是无效的别名,还是您只是认为它不标准?
    • 它是非标准的并且在除 SQL Server 之外的任何 DBMS 中都无效。
    • 顺便说一句:SQL Server 也支持标准语法。
    • @a_horse,它实际上在 Oracle 中非常好。该语句唯一的错误是 CTE 中的 WHERE 应该在 GROUP BY 之前。
    • @a_horse,抱歉,我迟到了,没有注意到编辑。就目前而言,答案很好。你的评论是正确的。
    猜你喜欢
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多