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,否则返回NULLCOUNT()函数会自动忽略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
相关产品推荐
相关产品推荐

