我在 Postgresql 中做错了什么,试图找到销售利润最高的 10% 商品的商店

问题描述 投票:0回答:1

我正在处理爱荷华州酒类销售数据库。我有一个包含当年所有交易的销售表,以及一个我加入的商店表,因为我想查看商店的名称,而不仅仅是他们的商店代码。

在销售表上,我按照该州产生的总利润总和找到了最畅销的 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 postgresql join subquery
1个回答
0
投票

您的 SQL 查询旨在识别销售利润最高的 10% 商品的商店,但它仅返回 9 行,考虑到数据集的规模,这似乎不正确。该问题可能源于您构建 JOIN 的方式,特别是 ON 子句中将

sales.store
top_10_pct.store
匹配的条件。由于您的子查询 (
top_10_pct
) 按
item
description
store
进行分组,但在 SELECT 中不包含
store
的情况下过滤聚合利润,因此在加入时可能无法按预期工作。

尝试按如下方式调整你的方法:

  1. 细化子查询:确保它根据利润标准选择项目,并在其输出中包含
    item
    ,以便与此列上的销售表进行清晰的 JOIN。
  2. 连接条件:在
    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
标识符将销售条目与利润最高的商品进行匹配,并按商店汇总销售额,从而可能解决行数意外低的问题。

© www.soinside.com 2019 - 2024. All rights reserved.