如何在SQL查询中用COUNT CASE作为条件?遇分组函数错误求助
解决SQL中WHERE子句使用聚合函数报错的问题
错误原因
SQL里的WHERE子句是分组前过滤单条数据的,而COUNT这类聚合函数是分组后对组内数据计算统计值的,两者执行顺序不同,直接在WHERE里用聚合函数就会触发invalid use of group function错误。
替代方案(无需在外层用HAVING)
如果不想在主查询的WHERE后加HAVING,可以用子查询预计算聚合值,再在外层筛选:
SELECT b.name AS Branches_name, b.code AS Branches__code, t.carried, t.unCarried FROM branches b INNER JOIN ( -- 子查询先按分支分组,计算已上架/未上架产品数量,并筛选出已上架=35的分支 SELECT company_id, branch_code, COUNT(CASE WHEN carried = 1 THEN 1 END) AS carried, COUNT(CASE WHEN carried = 0 THEN 1 END) AS unCarried FROM products_carried_per_branches WHERE deleted = 0 GROUP BY company_id, branch_code HAVING COUNT(CASE WHEN carried = 1 THEN 1 END) = 35 ) t ON t.company_id = b.company_id AND t.branch_code = b.code -- 外层WHERE只过滤单条分支的条件 WHERE b.company_id = 200017 AND b.deleted = 0
说明
这个方案把聚合计算和筛选逻辑放到子查询里,主查询只负责关联分支表和子查询结果,外层WHERE里都是针对单条分支的过滤条件,完全符合DataTable搜索的使用习惯。
内容的提问来源于stack exchange,提问作者Rey Chabby Estrera
相关产品推荐
相关产品推荐

