SQL查询(每年的最大总和)

SQL查询(每年的最大总和),sql,oracle,sum,max,Sql,Oracle,Sum,Max,我将尝试在这里描述我的问题。假设我有3张桌子: 1.销售 salesID(主键) productID(FK)-指向已售出产品的FK storeID(FK)-指向销售产品的商店的FK 月-产品销售的月份 年份-产品销售的年份 金额-产品销售的金额 2.产品 productID(主键) 产品名称 3.商店 存储ID(主键) 店名 我需要以下查询:对于每个商店,显示指定年份该商店中最畅销的产品。因此结果应该如下所示: STORE PRODUCT AMOUNT store1

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

1.销售

  • salesID(主键)
  • productID(FK)-指向已售出产品的FK
  • storeID(FK)-指向销售产品的商店的FK
  • 月-产品销售的月份
  • 年份-产品销售的年份
  • 金额-产品销售的金额
2.产品

  • productID(主键)
  • 产品名称
3.商店

  • 存储ID(主键)
  • 店名

我需要以下查询:对于每个商店,显示指定年份该商店中最畅销的产品。因此结果应该如下所示:

STORE    PRODUCT    AMOUNT
store1   product1   XXX amount
store2   product2   YYY amount
store3   product1   XYX amount
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;
其中每一笔金额将是当年所有金额中的最高金额

我现在能做的是:

  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数据库。
我非常感谢您的帮助。

对Oracle不太熟悉,但可能是:

STORE    PRODUCT    AMOUNT
store1   product1   XXX amount
store2   product2   YYY amount
store3   product1   XYX amount
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;

如果有一个tie同时返回两个条目,您可以使用
行号()
来限制每个storeName的一个结果。

对Oracle不太熟悉,但可能类似于:

STORE    PRODUCT    AMOUNT
store1   product1   XXX amount
store2   product2   YYY amount
store3   product1   XYX amount
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;

如果有一个tie同时返回两个条目,您可以使用
ROW\u NUMBER()
将每个storeName限制为一个结果。

@a\u horse\u和\u no\u name是
sales\u amount=SUM(sales.amount)
在oracle中是无效的别名,或者,您只是认为它是非标准的?它是非标准的,除了SQLServer之外,在任何DBMS中都是无效的。BTW: SQL Server也支持标准语法。@ AyMARE,它实际上在Oracle中很好。这个语句唯一的错误是CTE中的WHERE应该在GROUP BY之前。@a_horse,对不起,我迟到了,没有注意到编辑。现在看来,答案是好的。你的评论是正确的。@ AyHoerSyx,No.NoNeX是代码> SaluSuffAuth= =(Surviv.Author)<代码>在Oracle中没有有效的别名,或者你认为它是非标准的,它是非标准的,除了SQL Server之外,在任何DBMS中都是无效的。BTW:SQL Server也支持标准语法。@ AyMARE,它实际上在Oracle中很好。这个语句唯一的错误是CTE中的WHERE应该在GROUP BY之前。@a_horse,对不起,我迟到了,没有注意到编辑。现在看来,答案是好的。你的评论恰到好处。