如何合并两个按国家城市分组的用户活跃与非活跃统计SELECT查询?
合并用户活跃与近12个月非活跃统计的SQL方案
需求说明
现有user_data_table用户表,规则如下:
end_date为NULL:用户处于活跃状态end_date存在日期值:用户已非活跃
需要按country(国家)和city(城市)分组,同时输出:
- 全时段活跃用户数量
- 近12个月内变为非活跃的用户数量
原问题分析
你之前写了两个独立查询,但用UNION或子查询合并失败——原因是UNION用于合并行记录,而我们需要在同一行中展示两组统计值,因此可以通过单次分组+多条件聚合直接实现。
合并后的SQL查询
SELECT country, city, SUM(CASE WHEN end_date IS NULL THEN 1 ELSE 0 END) AS `active(all time)`, SUM(CASE WHEN end_date IS NOT NULL AND end_date BETWEEN ? AND ? THEN 1 ELSE 0 END) AS `not active(past year)` FROM user_data_table GROUP BY country, city ORDER BY country, city;
代码说明
- 无需拆分两次查询,在同一个
SELECT中通过两个CASE语句分别计算两类用户数 - 第一个
SUM(CASE...)统计所有end_date为NULL的活跃用户(全时段) - 第二个
SUM(CASE...)筛选出end_date非空且在指定日期范围内的非活跃用户(近12个月) - 最终按
country和city分组,直接得到你需要的结果格式
预期结果示例
| country | city | active(all time) | not active(past year) |
|---|---|---|---|
| 瑞典 | 斯德哥尔摩 | 25 | 1 |
| 瑞士 | 伯尔尼 | 43 | 13 |
内容的提问来源于stack exchange,提问作者pileup
相关产品推荐
相关产品推荐

