我正在处理爱荷华州酒类销售数据库。我有一个包含当年所有交易的销售表,以及一个我加入的商店表,因为我想查看商店的名称,而不仅仅是他们的商店代码。
在销售表上,我按照该州产生的总利润总和找到了最畅销的 10% 的商品,现在我正在尝试找出哪些商店出售这些商品,以及它们的销量。
-内部查询是查找前 10% 商品的说明(我是新手,不知道如何在 SQL 中执行此操作,但在 Excel 中发现总利润前 10% 的商品结束一个项目产生了 62,765 美元的利润。所以我做了 >= 62765)。内部查询向我显示了前 10% 中的 385 个项目。
-我将其设为与外部查询 JOIN 的表。在我的外部查询中,我询问销售这些商品的商店:
SELECT sales.store, stores.name, SUM(sales.total) AS total
FROM stores INNER JOIN sales
USING(store)
INNER JOIN (SELECT item, description, store
FROM sales
GROUP BY item, description, store
HAVING SUM((btl_price-state_btl_cost)*bottle_qty) :: numeric >= 62765) AS top_10_pct
ON sales.store = top_10_pct.store
GROUP BY sales.store, stores.name
ORDER BY total DESC
我认为这是错误的,因为当我运行它时,它只给了我 9 行。这是不对的,我知道有超过 9 家商店销售这些顶级商品 - 销售表上有 1352 家不同的商店和 385 种商品。
但我不知道我做错了什么!感谢您为 SQL 新手提供的任何想法!
您的 SQL 查询旨在识别销售利润最高的 10% 商品的商店,但它仅返回 9 行,考虑到数据集的规模,这似乎不正确。该问题可能源于您构建 JOIN 的方式,特别是 ON 子句中将
sales.store
与 top_10_pct.store
匹配的条件。由于您的子查询 (top_10_pct
) 按 item
、description
和 store
进行分组,但在 SELECT 中不包含 store
的情况下过滤聚合利润,因此在加入时可能无法按预期工作。
尝试按如下方式调整你的方法:
item
,以便与此列上的销售表进行清晰的 JOIN。sales
上连接 top_10_pct
和 item
,而不是在 store
上连接。这样,您就可以专门寻找利润最高的 10% 商品的销售情况。这是您的查询的修订版本:
SELECT
s.store,
st.name,
SUM(s.total) AS total
FROM
stores st
INNER JOIN sales s ON st.store = s.store
INNER JOIN (
SELECT
item
FROM
sales
GROUP BY
item
HAVING
SUM((btl_price - state_btl_cost) * bottle_qty) >= 62765
) AS top_10_pct ON s.item = top_10_pct.item
GROUP BY
s.store, st.name
ORDER BY
total DESC;
这侧重于通过
item
标识符将销售条目与利润最高的商品进行匹配,并按商店汇总销售额,从而可能解决行数意外低的问题。