Access SQL查询报错:筛选同一SKU含2个以上指定结束日期的记录
修正Access查询语句解决重复生效价格记录问题
原查询的错误分析
原语句存在以下Access SQL不兼容问题:
- Access不支持
CONVERT(DATE, ...)函数,需改用原生的CDate()做日期转换 - 同一个查询出现两个
WHERE子句,GROUP BY后的聚合结果筛选必须用HAVING而非WHERE - SELECT包含
PCL.*这类非聚合字段,但GROUP BY仅指定PCL.SKU,Access要求所有非聚合字段必须出现在GROUP BY中 - 原语句的
CASE WHEN写法在Access Jet SQL中不兼容,且本次需求可直接通过WHERE筛选替代
修正后的查询方案
方案1:获取所有违规的详细记录(可直接导出调整)
该查询会列出所有符合条件的重复生效记录,方便直接导出修改结束日期:
SELECT PCL.*, SKUP.SKU_DESC FROM PCL LEFT JOIN SKUP ON PCL.SKU = SKUP.SKU WHERE PCL.PRICELINE = "R12-RETAILER" AND CDate(PCL.DATEEND) = CDate("12/31/2100") AND PCL.SKU IN ( -- 先筛选出有2条及以上持续生效记录的SKU SELECT SKU FROM PCL WHERE PRICELINE = "R12-RETAILER" AND CDate(DATEEND) = CDate("12/31/2100") GROUP BY SKU HAVING COUNT(*) > 1 )
方案2:获取每个SKU的重复数量统计
如果需要先统计违规SKU的重复次数,可使用该查询:
SELECT PCL.SKU, SKUP.SKU_DESC, COUNT(*) AS [DuplicateCount] FROM PCL LEFT JOIN SKUP ON PCL.SKU = SKUP.SKU WHERE PCL.PRICELINE = "R12-RETAILER" AND CDate(PCL.DATEEND) = CDate("12/31/2100") GROUP BY PCL.SKU, SKUP.SKU_DESC HAVING COUNT(*) > 1
关键修正说明
- 日期转换:用
CDate()替代CONVERT,这是Access处理字符串转日期的标准函数 - 子查询筛选:先通过子查询定位违规SKU,避免主查询中GROUP BY与
PCL.*的冲突 - HAVING替代WHERE:GROUP BY之后筛选聚合结果必须使用
HAVING,WHERE仅用于筛选原始数据行
内容的提问来源于stack exchange,提问作者Andy L
相关产品推荐
相关产品推荐

