(Oracle SQL) 如何显示两年内下过订单的客户信息?

(Oracle SQL) How to display info about customers that made orders in two years?

我有一个名为 Orders 的 table,其中包含有关客户及其所下订单的信息,我想仅检索客户在 2009 年和 2010 年所下订单的信息。如何获取它?我编写了以下语句,但没有检索到任何信息。

SELECT   customer_id
FROM     cs_ordenes
WHERE    order_date BETWEEN '01/01/2009' AND '31/12/2009'
AND      order_date BETWEEN '01/01/2010' AND '31/12/2010'
ORDER BY customer_id DESC;

如何简化 WHERE 子句?

SELECT customer_id
FROM cs_ordenes
WHERE order_date >= DATE '2009-01-01' AND
      order_date < DATE '2011-01-01'
ORDER BY customer_id DESC;

如果您将两个语句之间的 AND 更改为 OR,您的原始逻辑将起作用。单个日期不可能在 2009 年和 2011 年,因此您的查询 returns 没有行。不过上面的逻辑更简单。

此外,BETWEEN 与日期一起使用是危险的,因为有时它们有时间成分。这就是为什么我更喜欢简单的不等式。

您可以使用聚合来检查每年是否至少有一个订单。

select customer_id
from cs_ordenes
where order_date >= date '2009-01-01'
    and order_date < date '2011-01-01'
group by customer_id
having count(distinct to_char(order_date, 'YYYY')) = 2

count(distinct to_char(order_date, 'YYYY')) 查找与每个客户的订单日期不同的年份。在我们的例子中,由于我们已经使用 WHERE 子句过滤了两年日期范围内的数据,如果计数为 2,则意味着每年至少有一个订单。

相同的 order_date 可以同时出现在 2009 年和 2010 年,因此不会返回任何行。一种方法是计算每个客户订单的不同年数:

SELECT   customer_id
FROM     cs_ordenes
WHERE    EXTRACT(YEAR FROM order_date) IN (2009, 2010)
GROUP BY customer_id
HAVING   COUNT(DISTINCT(EXTRACT(YEAR FROM order_date)) = 2
ORDER BY customer_id DESC;

” Select customer_id 来自订单 其中order_ date之间 To_date('01-01-2009','dd-mm-yyyy) 和 to_date('01-01-2010','dd-mm-yyyy')