如何统计每个客户的保单数量?SQL查询问题求助
客户保单数量统计的SQL解决方案
问题场景
两张表内连接后得到如下数据集:
| Policy Id | Customer |
|---|---|
| 1 | A |
| 1 | B |
| 1 | C |
| 2 | A |
| 2 | B |
需要统计每个客户对应的独立保单数量,预期输出:
| Customer | Policy Count |
|---|---|
| A | 2 |
| B | 2 |
| C | 1 |
你之前写的SQL无法得到正确结果:
select CustomerName, COUNT(policyid) as PolicyCount from Dummy group by clientId, policyid
问题原因
- 分组维度错误:你把
clientId和policyid一起加入GROUP BY,这会让分组变成「客户+单个保单」,最终统计的是每个客户在同一份保单里的出现次数,而不是客户拥有的独立保单总数。 - 字段名不匹配:你的查询里用了
CustomerName、clientId,但数据集里对应的字段是Customer,字段名不一致会导致报错或统计错误。
正确SQL写法
这里提供两种可靠的实现方式:
方式一:直接使用COUNT(DISTINCT)去重统计
这是最简洁的写法,通过DISTINCT确保每个保单ID只被统计一次:
select Customer, COUNT(DISTINCT PolicyId) as `Policy Count` from Dummy group by Customer
方式二:先去重再统计(适合大数据量场景)
如果你的数据集非常大,先通过子查询去除「客户-保单」的重复关联,再统计会更高效:
-- 先筛选出唯一的客户-保单关联记录 with UniquePolicyLinks as ( select distinct PolicyId, Customer from Dummy ) -- 再按客户统计保单数量 select Customer, COUNT(PolicyId) as `Policy Count` from UniquePolicyLinks group by Customer
补充说明
- 两种写法都能得到预期结果,小数据集用第一种即可;大数据量下第二种的性能表现通常更好。
- 确保查询里的字段名和你的实际数据表完全一致,比如如果你的客户字段是
ClientName,就替换掉Customer。
内容的提问来源于stack exchange,提问作者Chirag Gupta
相关产品推荐
相关产品推荐

