含COUNT DISTINCT的嵌套SELECT按第三列分组统计的实现问题
解决按ColumnC分组的条件统计问题
我完全懂你的需求——要按ColumnC分组,分别算出每组里满足两个不同条件的唯一id数量。你原来的SQL跑不起来,核心问题是里面的子查询没和分组的ColumnC关联,所以它只会返回全局的统计值,而不是每个分组各自的结果。
正确的做法是用条件聚合,把判断逻辑嵌入聚合函数里,这样就能针对每个分组计算对应统计值了。这里用COUNT(DISTINCT CASE ...)来实现:
SELECT ColumnC, -- 统计每组中Status不等于'closed'的唯一id数量 COUNT(DISTINCT CASE WHEN Status NOT LIKE 'closed' THEN id END) AS ColumnA, -- 统计每组中Status不等于'closed'且Datevalue不晚于当前日期的唯一id数量 COUNT(DISTINCT CASE WHEN Status NOT LIKE 'closed' AND Datevalue <= GETDATE() THEN id END) AS ColumnB FROM Database GROUP BY ColumnC;
逻辑拆解:
CASE语句会逐行检查条件,符合条件时返回对应的id,不符合则返回NULLCOUNT()函数会自动忽略NULL值,搭配DISTINCT就能得到每组中满足条件的唯一id总数GROUP BY ColumnC保证所有统计都是基于每个ColumnC分组单独计算的
如果某个ColumnC分组里没有符合条件的数据,对应的ColumnA或ColumnB会返回0,这应该正好匹配你的预期。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

