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

MySQL中如何按年份筛选符合特定订单数条件的邮箱记录

解决按年份订单数筛选邮箱的SQL方案

要实现你需要的按年份订单数筛选邮箱的需求,核心思路是按邮箱分组后,用条件聚合统计各年份订单数,再通过HAVING子句过滤符合条件的分组。你的伪SQL问题在于直接在WHERE里用聚合函数,这不符合SQL执行逻辑——聚合函数需要先分组才能计算,所以得用GROUP BY + HAVING的组合。

正确的SQL写法

SELECT email
FROM orders
-- 可选:如果表中有其他年份数据,先过滤掉无关年份可以提升性能
WHERE year IN (2000, 2001, 2002)
GROUP BY email
HAVING 
    -- 统计2000年订单数等于1
    SUM(CASE WHEN year = 2000 THEN 1 ELSE 0 END) = 1
    -- 统计2001年订单数≤5
    AND SUM(CASE WHEN year = 2001 THEN 1 ELSE 0 END) <= 5
    -- 统计2002年订单数等于3
    AND SUM(CASE WHEN year = 2002 THEN 1 ELSE 0 END) = 3;

写法说明

  • GROUP BY email:将订单按邮箱分组,确保每个分组对应一个用户的所有订单。
  • SUM(CASE ...):通过CASE语句标记目标年份的订单,再用SUM统计该年份的订单总数(也可以用COUNT(CASE WHEN year=2000 THEN 1 END),效果一致)。
  • HAVING:在分组聚合完成后,过滤出满足各年份订单数条件的邮箱。

补充简化写法(部分数据库支持)

如果你的数据库支持FILTER子句(比如PostgreSQL),可以用更简洁的语法实现:

SELECT email
FROM orders
WHERE year IN (2000, 2001, 2002)
GROUP BY email
HAVING 
    COUNT(*) FILTER (WHERE year = 2000) = 1
    AND COUNT(*) FILTER (WHERE year = 2001) <= 5
    AND COUNT(*) FILTER (WHERE year = 2002) = 3;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:05:28