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

将Excel的SUMIF转换为SQL:AS400发票总额计算及SQL报错排查

AS400 SQL实现发票明细及总额查询

问题背景

需要从AS400的X800SD.LPLI表提取发票明细数据,原流程是导出到Excel后用公式SUMIF(I:I,"="&I1,Z:Z)(I列为发票号,Z列为行项目金额)计算单张发票总额。现在要直接在SQL中实现总额计算,替代Excel公式。用户编写的SQL报错keyword FROM not expected,无法定位问题。

用户错误代码

SELECT 
    LPLI.LGRGNR AS invoice_number,
    LPLI.LGTENR as product_name,
    LPLI.LGNEWT as product_value,
    SUM (LPLI.LGNEWT FROM X800SD.LPLI LPLI) OVER (PARTITION BY LPLI.LGRGNR ORDER BY LPLI.LGRGNR) AS total_invoice_value
FROM 
    X800SD.LPLI LPLI
GROUP BY 
    LPLI.LGRGNR, LPLI.LGTENR, LPLI.LGNEWT
ORDER BY 
    LPLI.LGRGNR, LPLI.LGTENR, LPLI.LGNEWT

错误原因

  1. 窗口函数语法错误:SUM()函数里多余了FROM X800SD.LPLI LPLI子句,窗口函数的聚合操作基于当前查询的数据集,不需要重复指定表。
  2. 冗余的GROUP BY:使用窗口函数OVER(PARTITION BY)时,不需要额外GROUP BY,因为窗口函数会保留每一行明细,同时按指定字段分组计算聚合值,GROUP BY反而会把明细行合并,不符合需求。

正确SQL代码

SELECT 
    LPLI.LGRGNR AS invoice_number,
    LPLI.LGTENR AS product_name,
    LPLI.LGNEWT AS product_value,
    SUM(LPLI.LGNEWT) OVER (PARTITION BY LPLI.LGRGNR) AS total_invoice_value
FROM 
    X800SD.LPLI LPLI
ORDER BY 
    LPLI.LGRGNR, LPLI.LGTENR, LPLI.LGNEWT

代码说明

  • SUM(LPLI.LGNEWT) OVER (PARTITION BY LPLI.LGRGNR):按发票号LGRGNR分组,计算每组的金额总和,对应Excel中SUMIF的逻辑,同时保留每一行的明细数据。
  • 去掉了多余的GROUP BY,确保每条发票明细行都能显示,同时附带对应发票的总额。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:51:06