如何在SQL中对同一日期列进行两次条件筛选统计?
解决按类别分组并满足多日期区间求和条件的SQL写法
嘿,我明白你想实现的需求:按categories分组,筛选出那些在日期区间w到x内求和为0,同时在日期区间y到z内求和超过10000的类别。你的原始SQL写法存在语法问题,HAVING和WHEN不能那样组合使用,咱们来调整成正确的写法。
核心思路:条件聚合+分组筛选
我们可以用条件聚合分别计算每个类别在两个日期区间内的求和结果,然后在HAVING子句里同时校验这两个条件。
正确SQL示例
SELECT categories, -- 计算w-x区间的求和 SUM(CASE WHEN dates BETWEEN 'w' AND 'x' THEN values ELSE 0 END) AS sum_period1, -- 计算y-z区间的求和 SUM(CASE WHEN dates BETWEEN 'y' AND 'z' THEN values ELSE 0 END) AS sum_period2 FROM your_table GROUP BY categories -- 同时满足两个区间的条件 HAVING sum_period1 = 0 AND sum_period2 > 10000;
细节说明
- 把
your_table替换成你实际的表名,w、x、y、z替换成具体的日期值(注意用数据库支持的标准日期格式,比如'2023-01-01')。 - 如果你不需要在结果里显示两个区间的求和值,可以简化成下面的写法,直接在
HAVING里计算条件:
SELECT categories FROM your_table GROUP BY categories HAVING SUM(CASE WHEN dates BETWEEN 'w' AND 'x' THEN values ELSE 0 END) = 0 AND SUM(CASE WHEN dates BETWEEN 'y' AND 'z' THEN values ELSE 0 END) > 10000;
这种写法通过CASE语句精准控制每个日期区间内的数值参与求和,再通过GROUP BY和HAVING完成分组筛选,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者Rik Johnson
相关产品推荐
相关产品推荐

