SQL查询需求:按发票数量统计客户数及现有查询问题排查
解决发票数量-客户数统计的SQL报错问题
需求说明
现有数据表Sheet,包含字段customerID、InvoiceID、ProductID、Date、Income,需要统计拥有对应发票数量的客户数目,期望输出格式如下:
发票数量 ------ 对应该发票数量的客户数
1 ------------------------ 4
2 ------------------------ 3
4 ------------------------ 7
原SQL问题分析
你编写的SQL语句报错,核心原因是GROUP BY子句中不能直接使用聚合函数(比如COUNT(InvoiceID)),GROUP BY只能引用原始表字段或查询中已定义的别名(部分数据库支持)。
原错误SQL:
SELECT COUNT(DISTINCT customerID) AS 'Number of Clients', COUNT(InvoiceID) AS 'Number of Invoices' FROM Sheet GROUP BY COUNT(InvoiceID) ORDER BY COUNT(InvoiceID)
正确SQL写法
要实现需求,需要分两步统计:
- 先按客户分组,计算每个客户拥有的发票数量;
- 再按发票数量分组,统计对应数量的客户总数。
最终SQL代码
SELECT invoice_count AS '发票数量', COUNT(customerID) AS '对应该发票数量的客户数' FROM ( -- 子查询:统计每个客户的发票数量(若InvoiceID无重复可去掉DISTINCT) SELECT customerID, COUNT(DISTINCT InvoiceID) AS invoice_count FROM Sheet GROUP BY customerID ) AS customer_invoice_stats GROUP BY invoice_count ORDER BY invoice_count;
代码说明
- 子查询
customer_invoice_stats:先对每个客户的发票数做统计,得到每个客户对应的发票数量; - 外层查询:基于子查询的结果,按
invoice_count(发票数量)分组,统计每组对应的客户数量; - 若你的业务中每个
InvoiceID不会重复出现在同一个客户下,子查询里的COUNT(DISTINCT InvoiceID)可以简化为COUNT(InvoiceID)。
内容的提问来源于stack exchange,提问作者Ido Navon
相关产品推荐
相关产品推荐

