ACCESS SQL中IIf语句无法引用SUM计算列的问题
问题描述
我创建了名为Vergleich的新列,想用IIf语句比较Summe_Teile_SAB列与Import_Einzelstueckliste.Bedarfsmenge列。但Summe_Teile_SAB是通过SELECT子句里的SUM(SAB_Teile.Anzahl) AS Summe_Teile_SAB生成的求和计算列,没法在IIf语句里直接引用,导致无法按Teilenummer把Import_Einzelstueckliste.Bedarfsmenge的数值和SAB_Teile.Anzahl的同编号求和值做比较。
当前数据展示:
| Erstentnahme | Teilenummer | Summe_Teile_SAB | Bedarfsmenge | Vergleich |
|---|---|---|---|---|
| E | 1308713 | 1 | 1 | |
| E | 1308715 | 2 | 2 | |
| E | 1309059 | 4 | 4 | Differenz |
| E | 1309061 | 1 | 1 |
使用的SQL代码:
INSERT INTO Import_Einzelstueckliste ( Teilenummer, Teilenummer, Teilenummer, Teilenummer, Teilenummer, Teilenummer ) SELECT SAB_Teile.Erstentnahme, SAB_Teile.Teilenummer, SAB_Teile.Bezeichnung, SUM(SAB_Teile.Anzahl) AS Summe_Teile_SAB, Import_Einzelstueckliste.Bedarfsmenge, IIf([SAB_Teile.Anzahl]=[Import_Einzelstueckliste.Bedarfsmenge],"","Differenz") AS Vergleich FROM Import_Einzelstueckliste INNER JOIN SAB_Teile ON Import_Einzelstueckliste.Teilenummer = SAB_Teile.Teilenummer GROUP BY SAB_Teile.Erstentnahme, SAB_Teile.Teilenummer, SAB_Teile.Bezeichnung, Import_Einzelstueckliste.Bedarfsmenge, IIf([SAB_Teile.Anzahl]=[Import_Einzelstueckliste.Bedarfsmenge],"","Differenz") HAVING (((SAB_Teile.Erstentnahme) Like "E") AND ((SAB_Teile.Teilenummer)<>"")) ORDER BY SAB_Teile.Teilenummer;
我试过把IIf语句中的[SAB_Teile.Anzahl]改成[SAB_Teile.Summe_Teile_SAB],但问题还是没解决。
解决办法
核心问题是同层级的SELECT/GROUP BY语句无法直接引用别名计算列,加上原SQL存在两个明显错误:
- INSERT字段列表重复写了6次
Teilenummer,与SELECT返回的字段不匹配 - GROUP BY中包含IIf表达式,导致分组逻辑错误(IIf是聚合后的判断,不该参与分组)
正确的写法是用子查询先完成聚合计算,再在外层做比较:
-- 修正INSERT字段列表,确保与SELECT返回字段一一对应 INSERT INTO Import_Einzelstueckliste (Erstentnahme, Teilenummer, Bezeichnung, Summe_Teile_SAB, Bedarfsmenge, Vergleich) SELECT s.Erstentnahme, s.Teilenummer, s.Bezeichnung, s.Summe_Teile_SAB, i.Bedarfsmenge, IIf(s.Summe_Teile_SAB = i.Bedarfsmenge, "", "Differenz") AS Vergleich FROM Import_Einzelstueckliste i INNER JOIN ( -- 子查询先计算每个Teilenummer的求和值 SELECT Erstentnahme, Teilenummer, Bezeichnung, SUM(Anzahl) AS Summe_Teile_SAB FROM SAB_Teile WHERE Erstentnahme LIKE "E" AND Teilenummer <> "" GROUP BY Erstentnahme, Teilenummer, Bezeichnung ) s ON i.Teilenummer = s.Teilenummer ORDER BY s.Teilenummer;
关键说明
- 子查询提前完成聚合,得到每个
Teilenummer的Summe_Teile_SAB,外层可直接引用该值做IIf判断 - 将过滤条件从HAVING移到子查询的WHERE中,先过滤再聚合,提升执行效率
- 修正INSERT字段列表的错误,避免插入数据时的字段不匹配问题
- GROUP BY仅保留必要的分组字段,移除无关的IIf表达式,保证分组逻辑正确
内容的提问来源于stack exchange,提问作者aerisengineering
相关产品推荐
相关产品推荐

