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

Oracle整箱零箱统计场景下如何获取SUM求和的正确结果

问题错误原因

  • 你使用逗号连接主表与无关联条件的子查询,生成了笛卡尔积:子查询计算的是全表汇总的FULLBOX和SPARE_BOX,导致主表每一行数据都拼接了全局汇总的错误值
  • 计算逻辑不符合需求:FULLBOX和SPARE_BOX是每行商品独立计算的指标,不需要提前在子查询做SUM聚合,也不需要用ROUND函数处理
  • 多余的分组聚合:你期望的结果是每行商品对应自身的箱数统计,直接逐行计算即可,不需要加GROUP BY和SUM函数

修正后的SQL(适配多数数据库,可根据自身使用的数据库调整整除、取余函数)

SELECT 
    itm_code AS itmcd,
    itm_name AS itmname,
    PACKING_STYLE,
    TOTAL_QUANTITY,
    FULLBOX,
    SPARE_BOX,
    FULLBOX + SPARE_BOX AS TOTALBOX
FROM (
    SELECT 
        itm_code,
        itm_name,
        PACKING_STYLE,
        TOTAL_QUANTITY,
        -- 取整除的整数部分,MySQL可直接写 TOTAL_QUANTITY DIV PACKING_STYLE,Oracle可用TRUNC函数
        FLOOR(TOTAL_QUANTITY / PACKING_STYLE) AS FULLBOX,
        -- 取余判断是否需要备用箱,Oracle可替换为 MOD(TOTAL_QUANTITY, PACKING_STYLE)
        CASE WHEN TOTAL_QUANTITY % PACKING_STYLE = 0 THEN 0 ELSE 1 END AS SPARE_BOX
    FROM log0048d
    WHERE reqst_no = 'SMO21071900398'
) t

如果不需要嵌套子查询,也可以直接把计算逻辑写在最外层,语句更简洁:

SELECT 
    itm_code AS itmcd,
    itm_name AS itmname,
    PACKING_STYLE,
    TOTAL_QUANTITY,
    FLOOR(TOTAL_QUANTITY / PACKING_STYLE) AS FULLBOX,
    CASE WHEN TOTAL_QUANTITY % PACKING_STYLE = 0 THEN 0 ELSE 1 END AS SPARE_BOX,
    FLOOR(TOTAL_QUANTITY / PACKING_STYLE) + CASE WHEN TOTAL_QUANTITY % PACKING_STYLE = 0 THEN 0 ELSE 1 END AS TOTALBOX
FROM log0048d
WHERE reqst_no = 'SMO21071900398'

内容的提问来源于stack exchange,提问作者Khanh Van Luong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:18:02