如何用SQL汇总/合并设计不佳的MS Access表中的行数据?
MS Access 无高级函数实现数据转置方案
针对无法修改原表、不能用PARTITION BY/ROW_NUMBER()等函数的情况,以下是基于Access原生SQL的可行方案:
核心思路
通过分组聚合+子查询计数的方式,分别提取每个KeyID对应的PA规则、QL的第一条/第二条规则,最后关联合并结果。
完整SQL代码
假设原表名为RawTable,替换成你的实际表名即可:
SELECT pa_grp.KeyID, pa_grp.PA, ql_grp.QL, pa_grp.RuleNamePA, ql_grp.RuleNameQL, ql_sec.RuleNameQL2 FROM -- 提取PA对应的规则和状态 (SELECT KeyID, First(PA) AS PA, First(RuleName) AS RuleNamePA FROM RawTable WHERE PA = 'X' GROUP BY KeyID) AS pa_grp LEFT JOIN -- 提取QL的第一条规则和状态 (SELECT KeyID, First(QL) AS QL, First(RuleName) AS RuleNameQL FROM RawTable WHERE QL = 'X' GROUP BY KeyID) AS ql_grp ON pa_grp.KeyID = ql_grp.KeyID LEFT JOIN -- 提取QL的第二条规则(通过子查询计数定位) (SELECT t1.KeyID, t1.RuleName AS RuleNameQL2 FROM RawTable t1 WHERE QL = 'X' AND (SELECT COUNT(*) FROM RawTable t2 WHERE t2.KeyID = t1.KeyID AND t2.QL = 'X' AND t2.RuleName <= t1.RuleName) = 2) AS ql_sec ON pa_grp.KeyID = ql_sec.KeyID;
注意事项
- 如果
RuleName的排序不是按字符串顺序,需要调整子查询中的t2.RuleName <= t1.RuleName条件,替换成原表中能确定顺序的字段(比如存在时间戳或自增ID的话)。 - 若部分
KeyID没有第二条QL规则,RuleNameQL2会显示为Null,符合Access的默认行为。
内容的提问来源于stack exchange,提问作者BlueFlame
相关产品推荐
相关产品推荐

