SQL查询(每年的最大总和)
我将尝试在这里描述我的问题。假设我有3张桌子: 1.销售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
- salesID(主键)
- productID(FK)-指向已售出产品的FK
- storeID(FK)-指向销售产品的商店的FK
- 月-产品销售的月份
- 年份-产品销售的年份
- 金额-产品销售的金额
- productID(主键)
- 产品名称
- 存储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,对不起,我迟到了,没有注意到编辑。现在看来,答案是好的。你的评论恰到好处。