基于关联SQL表统计总工作清单数及近月新增数的实现方案
完整实现:按Country统计工作清单总数及近一月新增数
嘿,我来帮你搞定这个SQL报表需求!咱们的核心目标是基于country作为关联/分组键,输出每个国家的总工作清单数和近一个月新增的工作清单数。下面我会结合常见的业务场景给出完整实现,你可以根据自己的实际表结构调整细节。
场景1:仅从工作清单表统计(无单独Country表)
如果你的工作清单表本身已经包含country字段,直接分组统计即可:
-- MySQL写法 SELECT country, COUNT(*) AS total_work_lists, -- 统计该国家的所有工作清单总数 COUNT(CASE WHEN created_at >= DATE_SUB(NOW(), INTERVAL 1 MONTH) THEN 1 END) AS new_work_lists_last_month -- 也可以用SUM(IF(created_at >= DATE_SUB(NOW(), INTERVAL 1 MONTH), 1, 0)),效果完全一致 FROM work_lists -- 替换成你的工作清单表名 GROUP BY country ORDER BY country;
适配其他数据库的日期函数
不同数据库的“近一个月”日期计算语法略有差异,你可以按需替换:
- PostgreSQL:
created_at >= CURRENT_DATE - INTERVAL '1 month' - SQL Server:
created_at >= DATEADD(month, -1, GETDATE()) - Oracle:
created_at >= ADD_MONTHS(SYSDATE, -1)
场景2:关联独立的Country表(推荐)
如果有单独的countries表存储所有国家信息,建议用LEFT JOIN确保所有国家都能出现在报表中(哪怕该国家没有任何工作清单):
-- MySQL写法 SELECT c.country_name, -- 替换成你的Country表字段(如country_code、country等) COUNT(wl.id) AS total_work_lists, -- 用wl.id避免统计NULL值,确保准确性 COUNT(CASE WHEN wl.created_at >= DATE_SUB(NOW(), INTERVAL 1 MONTH) THEN 1 END) AS new_work_lists_last_month FROM countries c -- 你的国家表 LEFT JOIN work_lists wl ON c.country = wl.country -- 用country字段关联两张表 GROUP BY c.country_name ORDER BY c.country_name;
关键细节说明
- 统计逻辑:
COUNT(*)会统计所有行,而COUNT(CASE WHEN ... THEN 1 END)只会统计满足“近一个月”条件的行(不满足的会返回NULL,COUNT会自动忽略NULL) - LEFT JOIN的作用:确保即使某个国家没有任何工作清单,也会在报表中显示,此时
total_work_lists和new_work_lists_last_month都会显示为0,不会遗漏数据 - 日期范围自定义:如果需要统计上个月自然月的新增数据(而非过去30天),可以调整日期条件,比如MySQL中用
DATE_FORMAT(created_at, '%Y-%m') = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH), '%Y-%m')
内容的提问来源于stack exchange,提问作者user3191666
相关产品推荐
相关产品推荐

