显示所有在夏季没有购买任何东西的客户

时间:2015-08-29 12:49:41

标签: sql oracle inner-join

我有两个表“OEHR_Orders”和“OEHR_Customers”。 enter image description here enter image description here

客户和订单都有链接的Customer_ID。 我现在想要显示7月或8月份没有购买任何东西的所有客户。这是我的问题:

SELECT DISTINCT C.CUST_LAST_NAME ||'.'||SUBSTR(C.CUST_First_Name,1,1) AS "Name"
FROM OEHR_Customers C INNER JOIN OEHR_ORDERS O
ON C.Customer_ID = O.Customer_ID
WHERE EXTRACT(MONTH FROM O.Order_Date) NOT BETWEEN '7' and '8'

不幸的是,这个查询并没有给我想要的结果。

一些想法?

2 个答案:

答案 0 :(得分:1)

SELECT DISTINCT CUST_LAST_NAME ||'.'||SUBSTR(CUST_First_Name,1,1) AS "Name"
FROM OEHR_Customers
WHERE Customer_Id not in (Select Customer_ID from OEHR_ORDERS
            WHERE EXTRACT(MONTH FROM Order_Date) NOT BETWEEN '7' and '8')

答案 1 :(得分:0)

我倾向于使用GROUP BYHAVING

执行此操作
SELECT C.CUST_LAST_NAME || '.' || SUBSTR(C.CUST_First_Name, 1, 1) AS "Name"
FROM OEHR_Customers C INNER JOIN
     OEHR_ORDERS O
     ON C.Customer_ID = O.Customer_ID
GROUP BY C.CUST_LAST_NAME || '.' || SUBSTR(C.CUST_First_Name, 1, 1)
HAVING SUM(CASE WHEN EXTRACT(MONTH FROM O.Order_Date) BETWEEN 7 and 8
                THEN 1 ELSE 0 END) = 0;

HAVING子句计算出现第7个月和第8个月的次数。然后它过滤掉在这几个月内购买的客户。

您的查询版本只会让那些购买的客户不在这几个月内。