我会尝试在这里描述我的问题。假设我有3张桌子:
1。销售
2。产品
3. 商店
我需要以下查询:每家商店都会在指定年份的商店中展示最畅销的产品。因此结果应如下所示:
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数据库。 我将不胜感激任何帮助。
答案 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一个结果。