You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过SQL查询扣除同产品同单据销售退回后的产品最终销量

解决扣除销售退回后的销售数据计算问题

没问题,我帮你搞定这个需求!根据你描述的业务场景,我给出两种SQL方案,你可以根据实际的业务规则选择:

方案1:直接按产品抵消所有销售与退回

如果你的业务允许同一产品的所有销售(无论单据)和退回直接抵消,用这个简单的查询就够了:

SELECT
    product_id,
    SUM(CASE 
        WHEN status != 'sr' THEN quantity 
        ELSE -quantity 
    END) AS final_quantity
FROM
    sales
GROUP BY
    product_id;

逻辑说明:

  • 用CASE语句把标记为sales return(status = 'sr')的数量转为负数,正常销售的数量保持正数
  • 按product_id分组求和,自动抵消同一产品的销售与退回数量
  • 就像你举的例子:产品B0801180323NA的2个销售 + (-2)个退回,最终结果就是0

小提示:如果你的正常销售有明确的状态值(比如s代表销售),可以把status != 'sr'改成status = 's',这样能排除其他异常状态的记录,结果更严谨。


方案2:严格按「同产品同单据」抵消

如果你的业务规则要求只有同一单据下的销售退回才能抵消该单据的销售(比如不同订单的退回不能冲减其他订单的销售),用这个嵌套查询:

-- 先计算每个单据下每个产品的净数量,再汇总产品总销量
SELECT
    product_id,
    SUM(doc_net_quantity) AS final_quantity
FROM (
    SELECT
        order_no, -- 假设单据号字段是order_no,根据你的实际字段名修改
        product_id,
        SUM(CASE 
            WHEN status != 'sr' THEN quantity 
            ELSE -quantity 
        END) AS doc_net_quantity
    FROM
        sales
    GROUP BY
        order_no, product_id
) AS doc_product_summary
GROUP BY
    product_id;

逻辑说明:

  1. 内层查询先按「单据号+产品ID」分组,计算每个单据下该产品的净销量(销售减退回)
  2. 外层查询再按产品ID汇总所有单据的净销量,得到最终的产品总销量

这样就能严格保证只有同一单据内的退回才会抵消对应销售,避免跨单据的抵消问题。

内容的提问来源于stack exchange,提问作者Zainul Abideen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:55:35