基于多条件生成含SUM聚合列的SQL分组统计表问题咨询
错误原因
- 子查询未关联外层分组维度:你写的两个计数子查询默认统计全表符合购买次数条件的记录数,没有限制和外层当前行的
Category ID一致,所以所有分类的计数结果都相同。 - 存在语法错误:原始代码
SELECT子句第一行末尾缺逗号,GROUP BY后多余了两个聚合结果字段,语句末尾多逗号,都会触发语法报错。 - 逻辑冗余:不需要用子查询实现分组内的条件计数,用条件聚合写法更简洁高效。
推荐解决方案(兼容绝大多数SQL数据库)
使用CASE WHEN配合聚合函数实现分组内的条件计数,写法如下:
SELECT categoryID AS Category_ID, COUNT(CASE WHEN "Number of Purchases" >= 3 THEN customerID END) AS Total_Customers_3, COUNT(CASE WHEN "Number of Purchases" >= 5 THEN customerID END) AS Total_Customers_5, SUM("Number of Purchases") AS Total_Purchases FROM table GROUP BY categoryID
逻辑说明
- 按
categoryID分组后,CASE WHEN会对当前分类下的每条记录做判断:符合购买次数条件就返回customerID,不符合返回NULL COUNT统计时会自动忽略NULL值,最终得到每个分类下符合对应条件的客户数量- 如果存在同一个客户在同一分类下有多条记录的场景,把
COUNT改成COUNT(DISTINCT customerID)即可实现去重统计
子查询写法(不推荐,性能较差,仅作错误修正参考)
如果你坚持用子查询实现,需要补充子查询和外层的分类关联条件:
SELECT t1.categoryID AS Category_ID, (SELECT COUNT(t2.customerID) FROM table t2 WHERE t2.categoryID = t1.categoryID AND t2."Number of Purchases" >=3) AS Total_Customers_3, (SELECT COUNT(t2.customerID) FROM table t2 WHERE t2.categoryID = t1.categoryID AND t2."Number of Purchases" >=5) AS Total_Customers_5, SUM(t1."Number of Purchases") AS Total_Purchases FROM table t1 GROUP BY t1.categoryID
内容的提问来源于stack exchange,提问作者AL0290
相关产品推荐
相关产品推荐

