SQL分组统计需求:按发票数统计对应客户数量的查询语法
SQL统计发票数量对应的客户总数
原始数据表结构及数据
| income | date | productid | invoiceid | customerid |
|---|---|---|---|---|
| 300 | 2015-01-01 | A | 1234551 | 1 |
| 300 | 2016-01-02 | A | 1234552 | 1 |
| 300 | 2016-01-03 | B | 1234553 | 2 |
| 300 | 2016-01-03 | A | 1234553 | 2 |
| 300 | 2016-01-04 | C | 1234554 | 3 |
| 300 | 2016-01-04 | C | 1234554 | 3 |
| 300 | 2016-01-08 | A | 1234556 | 3 |
| 300 | 2016-01-08 | B | 1234556 | 3 |
| 300 | 2016-01-11 | C | 1234557 | 3 |
统计需求
统计每个客户的发票数量,以及对应发票数量的客户总数(例如:1张发票对应若干客户,2张发票对应若干客户,以此类推)。
根据示例数据:
- 客户1有2张发票
- 客户2有1张发票
- 客户3有3张发票
预期结果如下:
预期结果表
| invoice_count | customers_with_this_invoice_count |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
尝试过的SQL(未得到目标结果)
select * from ( select CustomerID,count(distinct InvoiceID) as 'Total Invoices' from exam GROUP BY CustomerID ) a
正确的SQL查询语句
在你现有子查询的基础上,需要再对发票数量进行分组统计,具体语句如下:
SELECT invoice_count, COUNT(customerid) AS customers_with_this_invoice_count FROM ( SELECT customerid, COUNT(DISTINCT invoiceid) AS invoice_count FROM exam GROUP BY customerid ) AS customer_invoice_counts GROUP BY invoice_count ORDER BY invoice_count;
语句说明
- 内层子查询:按
customerid分组,用COUNT(DISTINCT invoiceid)统计每个客户的唯一发票数量,避免同一张发票的多条记录重复计数,得到每个客户对应的发票数。 - 外层查询:对内层结果按
invoice_count分组,统计每个发票数对应的客户总数,最后按发票数排序保证结果有序。
内容的提问来源于stack exchange,提问作者Yuval
相关产品推荐
相关产品推荐

