You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于关联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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:07:56