使用CASE语句与GROUP BY聚合实现客户类型统计查询
客户类型分类与账户数量统计SQL实现
需求说明
使用CASE语句对客户类型进行分类,结合GROUP BY子句与聚合函数统计不同类型客户的账户数量。
原代码问题分析
提供的原始SQL存在以下问题:
- GROUP BY子句的CASE逻辑是拼接具体门店/个人名称,导致分组维度为单个客户/门店,而非按预设的客户类型统计,不符合需求
- CASE语句未闭合,存在语法错误
- 客户类型判断逻辑倒置(将仅存在PersonID的客户标记为
store)
修正后的SQL代码
SELECT COUNT(AccountNumber) AS 账户数量, CASE WHEN c.PersonID IS NOT NULL AND c.StoreID IS NOT NULL THEN '关联联系人的门店客户' WHEN c.PersonID IS NOT NULL AND c.StoreID IS NULL THEN '个人客户' WHEN c.PersonID IS NULL AND c.StoreID IS NOT NULL THEN '门店客户' ELSE '异常客户' END AS 客户类型 FROM Sales.Customer AS c LEFT JOIN Person.Person AS p ON c.PersonID = p.BusinessEntityID LEFT JOIN Sales.Store AS s ON c.StoreID = s.BusinessEntityID GROUP BY CASE WHEN c.PersonID IS NOT NULL AND c.StoreID IS NOT NULL THEN '关联联系人的门店客户' WHEN c.PersonID IS NOT NULL AND c.StoreID IS NULL THEN '个人客户' WHEN c.PersonID IS NULL AND c.StoreID IS NOT NULL THEN '门店客户' ELSE '异常客户' END
代码说明
- 统计逻辑:通过
COUNT(AccountNumber)统计各类型客户的账户总数 - 客户类型分类:利用CASE语句根据
PersonID和StoreID的存在情况划分客户类型:- 同时存在
PersonID和StoreID:归类为「关联联系人的门店客户」 - 仅存在
PersonID:归类为「个人客户」 - 仅存在
StoreID:归类为「门店客户」 - 两者均不存在:归类为「异常客户」
- 同时存在
- 分组逻辑:GROUP BY子句复用SELECT中的CASE分类逻辑,确保按客户类型维度进行分组统计
- 关联表:使用LEFT JOIN关联个人信息表
Person.Person和门店信息表Sales.Store,保证所有客户数据都被纳入统计
内容的提问来源于stack exchange,提问作者laquita simmons
相关产品推荐
相关产品推荐

