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

SQL Server中如何按日期合并查询结果,统计不同状态月度ID数量

正确实现方法(SQL Server)

你的需求是按月份统计指定状态对应的ID数量,本质是行转列的统计场景。之前使用INNER JOIN的方式会丢失仅存在单一状态的月份数据,因为INNER JOIN只保留两个子查询中日期完全匹配的记录,以下是两种可行的解决方案:

方案1:条件聚合(推荐)

直接在原表上通过CASE WHEN配合聚合函数完成统计,这是最简洁高效的写法:

SELECT 
    date,
    COUNT(CASE WHEN status = 4 THEN id END) AS "count(status1) = 4",
    COUNT(CASE WHEN status = 3 THEN id END) AS "count(status2) = 3"
FROM myTable
GROUP BY date
ORDER BY date;

原理说明:

  • CASE WHEN status = 4 THEN id END:仅当状态为4时返回对应ID,否则返回NULL
  • COUNT()函数会自动忽略NULL值,最终统计结果就是对应状态下的ID数量
  • 无需子查询或关联操作,性能更优

方案2:FULL OUTER JOIN(兼容你的思路)

如果想保留子查询的思路,需要用FULL OUTER JOIN替代INNER JOIN,同时处理空日期值:

SELECT 
    COALESCE(t1.date, t2.date) AS date,
    t1.status1 AS "count(status1) = 4",
    t2.status2 AS "count(status2) = 3"
FROM 
    (SELECT date, COUNT(id) AS status1 FROM myTable WHERE status = 4 GROUP BY date) t1
FULL OUTER JOIN
    (SELECT date, COUNT(id) AS status2 FROM myTable WHERE status = 3 GROUP BY date) t2
ON t1.date = t2.date
ORDER BY date;

原理说明:

  • FULL OUTER JOIN会保留两个子查询中的所有日期记录,无论两边是否存在匹配项
  • COALESCE(t1.date, t2.date):当某一边日期为NULL时,取另一边的日期值,确保date列不为空

原SQL失效原因:

你使用的INNER JOIN仅返回两个子查询中日期完全重合的记录,但示例数据中2022-05只有状态4、2022-06只有状态3,没有共同日期,因此原SQL会返回空结果,无法得到期望的两条记录。

内容的提问来源于stack exchange,提问作者Axios

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:05:48