Access查询需求:按规则生成PO单状态汇总表
Access查询实现PO状态汇总方案
先把你的需求用更清晰的方式整理下,方便对照:
原始数据表(假设表名为PO_Details)
| PO | PN | Status |
|---|---|---|
| 1 | A | Open |
| 1 | B | progress |
| 1 | C | Delivered |
| 2 | A | Open |
| 3 | A | Delivered |
| 3 | A | Delivered |
预期汇总结果
| PO | Status |
|---|---|
| 1 | PROGRESS |
| 2 | OPEN |
| 3 | Delivered |
这里给你两种实用的Access查询方案,都能完美匹配你设定的状态规则:
方案一:使用EXISTS子查询 + IIF函数(逻辑直观易维护)
这种方式完全按照你给出的规则顺序来判断,可读性很强:
SELECT PO, IIF( -- 规则1:存在progress或Delivered状态,PO设为PROGRESS EXISTS(SELECT 1 FROM PO_Details AS sub WHERE sub.PO = main.PO AND sub.Status IN ('progress', 'Delivered')), 'PROGRESS', IIF( -- 规则2:仅存在OPEN状态,PO设为OPEN EXISTS(SELECT 1 FROM PO_Details AS sub WHERE sub.PO = main.PO AND sub.Status = 'Open') AND NOT EXISTS(SELECT 1 FROM PO_Details AS sub WHERE sub.PO = main.PO AND sub.Status NOT IN ('Open')), 'OPEN', -- 规则3:所有物料状态一致,取该状态 (SELECT TOP 1 Status FROM PO_Details AS sub WHERE sub.PO = main.PO) ) ) AS Status FROM PO_Details AS main GROUP BY PO;
逻辑说明:
- 先通过
GROUP BY PO确保每个采购订单只返回一条记录 - 第一层判断优先检查是否存在符合规则1的状态,满足就直接返回
PROGRESS - 不满足规则1的话,再检查是否所有物料都是
Open状态(规则2),满足则返回OPEN - 最后兜底的情况就是所有物料状态一致,直接取任意一条的状态即可
方案二:使用SWITCH函数 + 聚合统计(代码更简洁)
如果喜欢更紧凑的写法,可以用SWITCH结合聚合函数来实现:
SELECT PO, SWITCH( -- 规则1:存在progress或Delivered状态 COUNT(IIF(Status IN ('progress', 'Delivered'), 1, NULL)) > 0, 'PROGRESS', -- 规则2:所有物料都是Open状态 COUNT(IIF(Status = 'Open', 1, NULL)) = COUNT(*), 'OPEN', -- 规则3:所有状态一致,取该状态 TRUE, (SELECT TOP 1 Status FROM PO_Details AS sub WHERE sub.PO = PO_Details.PO) ) AS Status FROM PO_Details GROUP BY PO;
逻辑说明:
COUNT(IIF(...))用来统计符合特定状态的记录数,NULL会被COUNT忽略- 第一个条件判断是否有规则1的状态记录,有就返回
PROGRESS - 第二个条件判断
Open状态的记录数等于总记录数(也就是全是Open),返回OPEN - 最后
TRUE分支处理所有状态一致的情况
小提示:
如果你的数据里状态值大小写不统一(比如Progress和progress混存),可以用UCASE(Status)来统一判断,比如把Status IN ('progress', 'Delivered')改成UCASE(Status) IN ('PROGRESS', 'DELIVERED'),避免因为大小写导致的判断错误。
内容的提问来源于stack exchange,提问作者Bruno Valente
相关产品推荐
相关产品推荐

