2016-10-21 46 views
0

我試圖讓那些在一月&月訂單的客戶名單,但不是在SQL客戶的訂單列表

三月
SELECT distinct C.CustID, FirstName + ', ' + LastName AS CustomerName, OrderDate 
FROM Customers C JOIN Orders O ON 
     C.CustID = O.CustID 
WHERE C.CustID in 
     (select CustID 
     from Customers 
     where month(OrderDate) >= 01) 
    and 
     C.CustID in 
     (select CustID 
     from Customers 
     where month(OrderDate) <= 02) 
    and 
     C.CustID IN 
     (select CustID 
     from Customers 
     where month(OrderDate) != 03); 
+0

縮進與4位代碼格式化時,將它做成一個代碼塊。您也可以突出顯示整個代碼,並點擊編輯器頂部的代碼格式化按鈕。 – JNevill

+0

我從jan和feb獲取所有客戶的列表,而不僅僅是那些未在3月訂購的客戶 – codelearner

回答

0

有此一展身手:

SELECT C.CustID, C.FirstName + ', ' + C.LastName AS CustomerName, O1.OrderDate 
FROM Customers C 
INNER JOIN (
    SELECT CustID FROM Orders WHERE month(OrderDate) IN (1,2) 
) O1 ON C.CustID=O1.CustID 
LEFT JOIN (
    SELECT CustID FROM Orders WHERE month(OrderDate) IN (3) 
) O2 ON C.CustID=O2.CustID 
WHERE O2.CustID IS NULL 
GROUP BY C.CustID, C.FirstName, C.LastName, O1.OrderDate 
+1

感謝您的幫助。得到了理想的結果。 – codelearner

+0

@codelearner沒問題。使用LEFT JOIN並檢查NULL是檢測錶行之間不匹配的好方法,同時還返回第一個表。我經常使用它。 – Matthew

0

發現,3月份有訂單的客戶,並使用NOT IN操盤的IN

SELECT distinct C.CustID, FirstName + ', ' + LastName AS CustomerName, OrderDate 
FROM Customers C JOIN Orders O ON 
     C.CustID = O.CustID 
WHERE C.CustID in 
     (select CustID 
     from ORders 
     where month(OrderDate) BETWEEN 1 AND 2)  
    AND C.CustID NOT IN 
     (select CustID 
     from ORders 
     where month(OrderDate) 03); 

我也改變了前兩個條件成一個,所以這是一個更快的smidge。

另外,正如@Matthew所指出的,您的CustID和OrderDate字段可能在您的Order表上,因此在子查詢中使用它會更好一些。

+0

我期望OrderDate是Orders表中的一列。 – Matthew

+0

這是一個相當合理的懷疑。我會添加到答案 – JNevill

0
SELECT C.CustID, C.FirstName + ', ' + C.LastName AS CustomerName, O1.OrderDate 
FROM Customers C 
LEFT OUTER JOIN 
      (SELECT CustID FROM Orders WHERE month(OrderDate) IN (3)) O ON 
    O. CustID = C.CustID 
WHERE month(C.OrderDate) IN (1,2) 
AND O.CustID IS NULL