SQL使用Group by按条件分组统计多状态客户数实现方法
按月份统计客户状态分布的SQL实现
核心逻辑分两层聚合:
- 第一层按
Month+CustomerID分组,判定每个客户在对应月份的状态归属:同时存在Accepted/Rejected、仅Rejected、仅Accepted - 第二层按
Month分组,分别统计三类归属的去重客户总数
-- 使用时将 your_customer_table 替换为实际存储客户数据的表名即可 WITH customer_status_classify AS ( SELECT Month, CustomerID, CASE WHEN SUM(CASE WHEN Status = 'Accepted' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN Status = 'Rejected' THEN 1 ELSE 0 END) > 0 THEN 'both_status' WHEN SUM(CASE WHEN Status = 'Accepted' THEN 1 ELSE 0 END) > 0 THEN 'only_accepted' WHEN SUM(CASE WHEN Status = 'Rejected' THEN 1 ELSE 0 END) > 0 THEN 'only_rejected' END AS status_type FROM your_customer_table GROUP BY Month, CustomerID ) SELECT Month, SUM(CASE WHEN status_type = 'both_status' THEN 1 ELSE 0 END) AS `accepted & rejected`, SUM(CASE WHEN status_type = 'only_rejected' THEN 1 ELSE 0 END) AS rejected, SUM(CASE WHEN status_type = 'only_accepted' THEN 1 ELSE 0 END) AS accepted FROM customer_status_classify GROUP BY Month;
兼容性说明:该写法遵循ANSI SQL标准,可直接在MySQL 8.0+、PostgreSQL、SQL Server、Oracle、ClickHouse等绝大多数主流数据库运行。使用示例数据执行后,输出结果和预期完全一致:June维度下双状态客户数1、仅拒绝客户数2、仅通过客户数1。如果使用不支持CTE语法的低版本数据库,可将CTE部分替换为嵌套子查询,逻辑完全相同。
内容的提问来源于stack exchange,提问作者Agustina Garcia Guevara
相关产品推荐
相关产品推荐

