如何筛选sales.orders表中所有订单年份均有采购的customer_id?
筛选所有年份均有采购记录的客户ID
原SQL的问题
你写的语句逻辑错误:WHERE year(order_date) = ALL(...)是要求单条订单的年份等于所有存在的订单年份,但一个订单只能属于某一个年份,永远不可能满足这个条件,所以查不出结果。
正确实现方式
我们需要对比每个客户的采购年份数量和系统中所有订单的年份总数,若两者相等,说明该客户每年都有采购。
-- 列出所有年份均有采购记录的customer_id SELECT customer_id FROM sales.orders GROUP BY customer_id HAVING COUNT(DISTINCT YEAR(order_date)) = ( -- 统计系统中所有存在订单的不同年份总数 SELECT COUNT(DISTINCT YEAR(order_date)) FROM sales.orders );
逻辑说明
- 子查询计算出业务开展以来所有有订单的不同年份数量。
- 主查询按
customer_id分组,统计每个客户有采购记录的不同年份数。 - 通过
HAVING子句筛选出客户的年份数等于总年份数的记录,即为每年都有采购的客户。
内容的提问来源于stack exchange,提问作者Nikhil Govula
相关产品推荐
相关产品推荐

