SQL中SUM与CASE结合按发票号renr分组求和异常问题排查
问题描述
我有一张e_auftragseingang表,包含字段:
artikelnummer(物料编号)artikelbeschreibung(物料描述)renr(发票号)
我需要通过CASE语句根据物料描述中的标识赋值:匹配ST#得2,匹配RT#得1,匹配PN#得3,否则为0。最终期望按相同的发票号renr对CASE结果分组求和,但当前得到的是全局总和而非分组后的结果。
示例数据
| artikelnummer | artikelbeschreibung | renr | 当前结果 | 期望结果 |
|---|---|---|---|---|
| 1010 | REnr. 1234567 | 2345678 | 0 | 0 |
| 0 | GN 2345678 #ST #1234567 | 2345678 | 0 | 0 |
| 1234 | REnr. 1234567 | 2345678 | 253 | 2 |
注:第一条记录因CASE语句的前置条件返回0。
当前SQL代码
CASE WHEN THEN -- Until this point, everything is working. SELECT Sum(CASE WHEN Try_convert( int, [artikelnummer]) <> 0 AND LEFT([artikelbeschreibung], 2) = 'GN' THEN 0 WHEN Charindex('GN', [artikelbeschreibung]) > 0 AND Charindex('ST#', [artikelbeschreibung]) > 0 THEN 2 WHEN Charindex('GN', [artikelbeschreibung]) > 0 AND Charindex('RT#', [artikelbeschreibung]) > 0 THEN 1 WHEN Charindex('GN', [artikelbeschreibung]) > 0 AND Charindex('PN#', [artikelbeschreibung]) > 0 THEN 3 ELSE 0 END) AS result FROM e_auftragseingang WHERE [renr] = e_auftragseingang.[renr]
问题原因与解决方法
问题根源
- 缺少分组语句:当前SQL没有
GROUP BY renr,SUM函数会计算全表符合条件记录的总和,而非按每个renr单独分组计算。 - WHERE子句逻辑无效:
WHERE renr = e_auftragseingang.renr是无意义的自关联条件,等同于没有过滤,会返回所有记录。 - 冗余语法错误:代码开头的
CASE WHEN THEN属于无效语法,没有实际作用,需要移除。
修正后的SQL代码
SELECT renr, Sum(CASE WHEN Try_convert(int, [artikelnummer]) <> 0 AND LEFT([artikelbeschreibung], 2) = 'GN' THEN 0 WHEN Charindex('GN', [artikelbeschreibung]) > 0 AND Charindex('ST#', [artikelbeschreibung]) > 0 THEN 2 WHEN Charindex('GN', [artikelbeschreibung]) > 0 AND Charindex('RT#', [artikelbeschreibung]) > 0 THEN 1 WHEN Charindex('GN', [artikelbeschreibung]) > 0 AND Charindex('PN#', [artikelbeschreibung]) > 0 THEN 3 ELSE 0 END) AS result FROM e_auftragseingang -- 如需筛选特定发票号,可添加WHERE条件:WHERE renr = '2345678' GROUP BY renr;
说明
- 添加
GROUP BY renr后,SUM会按每个发票号单独计算总和,得到分组后的期望结果。 - 移除了无效的开头CASE语句和错误的WHERE条件,若需指定某一发票号,可按需添加
WHERE renr = '目标发票号'。 - 保留了原CASE语句的赋值逻辑,确保每条记录的规则不变。
内容的提问来源于stack exchange,提问作者Jonas Aust
相关产品推荐
相关产品推荐

