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

SAP B1中Running Total SQL实现遇阻,求技术解决方案

问题分析与解决方案

看起来你在给查询加汇总行的时候踩了两个常见的SQL坑:一是非聚合列未在GROUP BY中声明,二是错误地对原始表分组导致无法得到单一汇总行。我来帮你一步步解决:

错误原因拆解

  1. 第一个报错是因为你在UNION ALL的第二部分查询里直接引用了T3.[OnHand],但这个字段既没有被SUM()这类聚合函数包裹,也没出现在GROUP BY里——SQL Server的严格模式要求,SELECT列表里的非聚合列必须全部包含在GROUP BY中,否则会拒绝执行。
  2. 当你给第二部分加上和主查询一样的GROUP BY后,相当于又执行了一次明细分组,自然会得到多行结果,而不是你想要的单一汇总行。

修正后的查询代码

正确的做法是先把主查询的明细结果封装成一个临时数据集(用CTE或者子查询),然后基于这个数据集生成汇总行:

WITH ItemMissingQty AS (
    SELECT 
        T1.[ItemCode],
        T4.[ItmsGrpNam],
        CASE 
            WHEN T3.[OnHand] - SUM(T1.[OpenQty]) < SUM(T1.[OpenQty]) 
            THEN T3.[OnHand] - SUM(T1.[OpenQty]) 
            ELSE SUM(T1.[OpenQty]) 
        END AS [Missing Quantity]
    FROM ORDR T0 
    INNER JOIN RDR1 T1 ON T0.DocEntry = T1.DocEntry 
    INNER JOIN OITM T2 ON T1.ItemCode = T2.ItemCode 
    INNER JOIN OITW T3 ON T2.ItemCode = T3.ItemCode 
    INNER JOIN OITB T4 ON T2.ItmsGrpCod=T4.ItmsGrpCod 
    WHERE 
        T3.[WhsCode] = T1.[WhsCode] 
        AND T0.[DocDueDate] <= '[%D1]' 
        AND (T4.[ItmsGrpNam] = 'Commercial' OR T4.[ItmsGrpNam] = 'Residentiel') 
    GROUP BY T1.[ItemCode], T3.[OnHand], T4.[ItmsGrpNam] 
    HAVING 
        T3.[OnHand] - SUM(T1.[OpenQty]) < 0 OR SUM(T1.[OpenQty]) < 0
)
-- 输出明细行
SELECT ItemCode, ItmsGrpNam, [Missing Quantity]
FROM ItemMissingQty
UNION ALL
-- 输出汇总行
SELECT 
    'Total' AS ItemCode, 
    'Total Missing Quantity' AS ItmsGrpNam, 
    SUM([Missing Quantity]) AS [Missing Quantity]
FROM ItemMissingQty;

逻辑说明

  • 首先用CTE ItemMissingQty 存储你原来的主查询结果,确保只返回符合条件的明细行,这部分逻辑和你最初的需求完全一致。
  • 然后通过UNION ALL组合两个结果集:先输出所有明细行,再输出一行汇总——这里直接对CTE里的[Missing Quantity]求和,就能得到所有缺失数量的累计值,同时自定义汇总行的标识文本。

这样既解决了GROUP BY的报错问题,又能得到你想要的单一汇总行啦。

内容的提问来源于stack exchange,提问作者S. Potvin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:44:53