将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
错误原因
- 窗口函数语法错误:
SUM()函数里多余了FROM X800SD.LPLI LPLI子句,窗口函数的聚合操作基于当前查询的数据集,不需要重复指定表。 - 冗余的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
相关产品推荐
相关产品推荐

