如何在SQL中结合WHERE与GROUP BY子句实现多字段条件数据查询?
正确结合WHERE与GROUP BY统计气温超35℃天数的方法
先看你的需求:统计2022年6月气温超过35摄氏度的天数,原SQL存在几个问题:
BETWEEN语法错误,应该用AND替代TOGROUP BY temp > '35'写法不符合逻辑,且如果temp是数值类型,不能加单引号- 单纯统计超35℃的总天数,其实不需要
GROUP BY,直接用WHERE过滤后聚合即可
1. 直接统计超35℃的总天数
如果只需要总数,最简单的写法:
SELECT COUNT(*) AS hot_days_count FROM weather_data WHERE day BETWEEN '2022-06-01' AND '2022-06-30' AND temp > 35; -- temp为数值类型时无需加引号
这里WHERE完成两步过滤:
- 先筛选出2022年6月的所有日期数据
- 再从中挑出气温超35℃的行
最后用COUNT(*)统计符合条件的总行数,就是你要的高温天数。
2. 如果需要分组统计(超35℃/未超35℃的天数)
如果想同时知道6月里高温和非高温的天数分别是多少,可以用GROUP BY配合条件判断:
SELECT CASE WHEN temp > 35 THEN '气温超35℃' ELSE '气温≤35℃' END AS temp_category, COUNT(*) AS day_count FROM weather_data WHERE day BETWEEN '2022-06-01' AND '2022-06-30' GROUP BY temp_category; -- 也可以直接GROUP BY CASE的判断逻辑
这里WHERE先过滤出6月的所有数据,再用CASE把气温分成两类,最后按分类分组统计天数。
WHERE和GROUP BY的核心逻辑
WHERE是分组前过滤:先排除所有不符合条件的行,剩下的行再参与分组和聚合计算- 如果需要对分组后的结果再次过滤(比如只看天数超过5天的分类),才用
HAVING子句,示例:
SELECT CASE WHEN temp >35 THEN '超35℃' ELSE '正常' END AS category, COUNT(*) AS day_count FROM weather_data WHERE day BETWEEN '2022-06-01' AND '2022-06-30' GROUP BY category HAVING day_count > 5; -- 只保留天数超过5天的分类
内容的提问来源于stack exchange,提问作者Dheeraj
相关产品推荐
相关产品推荐

