SQL Server查询报错:聚合函数不可出现在WHERE子句,求问题原因
SQL查询错误原因分析
原查询代码
SELECT a.Campaign, COUNT(DISTINCT a.Customer) AS 'Records', MIN(a.LastRecord) AS 'First Record', MAX(a.LastRecord) AS 'Last Record', MAX(a.daytime) AS 'Records up to' FROM contacts.dbo.contacts_ALL a JOIN sms b ON a.Customer = b.Customer WHERE a.LastRecord >= MIN(b.smsDelivered) GROUP BY a.Campaign HAVING a.LastRecord >= MIN(b.smsDelivered) ORDER BY a.Campaign DESC, [First Record]
报错信息
聚合函数不得出现在WHERE子句中,除非它包含在HAVING子句或SELECT列表的子查询中,且被聚合的列为外部引用。
问题点说明
- WHERE子句误用聚合函数:WHERE子句是在分组前对单条数据行做筛选,此时
MIN(b.smsDelivered)这类聚合函数还没计算出结果(聚合逻辑是分组后才执行的),所以不能直接在WHERE里调用聚合函数。 - HAVING子句引用非法列:HAVING是分组后筛选分组结果,只能使用
GROUP BY里的分组列(这里是a.Campaign),或者对其他列使用聚合函数。你直接写a.LastRecord >= MIN(b.smsDelivered),a.LastRecord既不在GROUP BY中,也没有用聚合函数包裹,SQL Server无法确定要取该分组里哪一条a.LastRecord的值来做判断。
修正思路参考
如果你的需求是筛选出每个分组中,对应Customer的LastRecord大于等于其最小smsDelivered的记录,可以先通过子查询算出每个Customer的最小smsDelivered,再关联原表做筛选:
SELECT a.Campaign, COUNT(DISTINCT a.Customer) AS 'Records', MIN(a.LastRecord) AS 'First Record', MAX(a.LastRecord) AS 'Last Record', MAX(a.daytime) AS 'Records up to' FROM contacts.dbo.contacts_ALL a JOIN ( SELECT Customer, MIN(smsDelivered) AS min_smsDelivered FROM sms GROUP BY Customer ) b ON a.Customer = b.Customer WHERE a.LastRecord >= b.min_smsDelivered GROUP BY a.Campaign ORDER BY a.Campaign DESC, [First Record]
内容的提问来源于stack exchange,提问作者Kaptah
相关产品推荐
相关产品推荐

