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

如何编写SQL查询筛选近30天订单总额超100美元的客户?

正确的SQL查询方案

你的原始查询存在几个核心问题:

  • 直接在WHERE子句中使用表名ORDERS属于语法错误,无法直接将表与数值做比较
  • 未关联customers和orders表,无法建立客户与订单的对应关系
  • 缺少近30天的时间筛选条件
  • 未处理重复客户的情况(同一客户可能有多笔符合条件的订单)

以下是两种符合需求的原生SQL写法,适配不同场景:

方法1:使用JOIN关联表(直观易懂)

SELECT DISTINCT c.name
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE o.order_date >= CURRENT_DATE - INTERVAL '30 days'
  AND o.total_amount > 100
ORDER BY o.total_amount DESC;

关键说明:

  • JOIN orders o ON c.customer_id = o.customer_id:通过客户ID关联客户表与订单表,确保获取的是有对应订单的客户
  • o.order_date >= CURRENT_DATE - INTERVAL '30 days':筛选近30天内的订单(不同数据库的日期语法有细微差异,见下方补充)
  • o.total_amount > 100:筛选订单总额超过100美元的记录
  • DISTINCT:避免同一客户因多笔符合条件的订单被重复输出
  • ORDER BY o.total_amount DESC:按订单总额降序排列结果

方法2:使用EXISTS子查询(性能更优,适合仅需客户姓名的场景)

SELECT c.name
FROM customers c
WHERE EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id = c.customer_id
      AND o.order_date >= CURRENT_DATE - INTERVAL '30 days'
      AND o.total_amount > 100
)
ORDER BY (
    SELECT MAX(o.total_amount)
    FROM orders o
    WHERE o.customer_id = c.customer_id
      AND o.order_date >= CURRENT_DATE - INTERVAL '30 days'
      AND o.total_amount > 100
) DESC;

关键说明:

  • EXISTS子查询仅验证当前客户是否存在符合条件的订单,无需返回具体数据,查询性能更高效
  • ORDER BY中的子查询用于获取该客户符合条件的订单中最大的总额,确保按订单总额降序排列

不同数据库的日期语法补充

如果你的数据库不是标准SQL环境,需要调整日期筛选语句:

  • MySQL:o.order_date >= CURDATE() - INTERVAL 30 DAY
  • SQL Server:o.order_date >= DATEADD(day, -30, GETDATE())
  • PostgreSQL:保持CURRENT_DATE - INTERVAL '30 days'即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:43:25