通过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;
逻辑说明:
- 内层查询先按「单据号+产品ID」分组,计算每个单据下该产品的净销量(销售减退回)
- 外层查询再按产品ID汇总所有单据的净销量,得到最终的产品总销量
这样就能严格保证只有同一单据内的退回才会抵消对应销售,避免跨单据的抵消问题。
内容的提问来源于stack exchange,提问作者Zainul Abideen
相关产品推荐
相关产品推荐

