2017-05-08 100 views
1

客戶表共有1000個客戶,其中1500個訂單在2016財年。但是我們想在FY中顯示所有客戶的訂單總數2016年客戶是否在該FY下單。但SQL Server 2012中的以下查詢僅顯示1490.爲什麼這個左外部連接不包括左邊的所有主鍵

我們在這裏可能會丟失什麼?

SELECT c.CustomerID, count(*) AS TotalOrders 
FROM Customers c 
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID 
WHERE o.FiscalYear = '2016' 
GROUP BY c.CustomerID 

UPDATE

下面的查詢返回只有1次以上的記錄(1491) - 還缺9條記錄。

SELECT c.CustomerID, count(*) AS TotalOrders 
FROM Customers c 
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID 
        AND o.FiscalYear = '2016' 
GROUP BY c.CustomerID 
+1

where子句在連接後應用。所以連接爲沒有訂單的客戶返回空值。但由於這些客戶沒有訂單,因此財務年度不等於2016年,因此記錄被排除在外。要更正將外部聯接涉及的限制條件移動到聯接條件,以便限制與聯接一起施加。 – xQbert

+3

您的總記錄數應該是1000(客戶),總數應該是1500.總和小於1500的唯一可能差異是您已經刪除了客戶和孤兒訂單。或者你的2016年訂單1500的數量是錯誤的開始。 'SELECT * from customer where customerID not in(Select customerID from customers)and FiscalYear ='2016''給你一些記錄? – xQbert

+0

是的,我會開始檢查像:您的FiscalYear實際上是不同的「2016」的所有記錄?有錯別字的可能嗎?記錄如何被標記刪除(bit/int標誌)? –

回答

6

where子句轉動left outer joinInner join

將其更改爲AND

SELECT c.CustomerID, count(o.CustomerID) AS TotalOrders 
FROM Customers c 
LEFT JOIN Orders o 
    ON c.CustomerID = o.CustomerID 
    AND o.FiscalYear = '2016'  -- Here 
GROUP BY c.CustomerID 
+0

我應該提到我嘗試過在'LEFT JOIN'中加入'Where'條件,但是它只增加了1條記錄。仍然缺少9條記錄。 – nam

+0

@nam這不是查詢。您現在可以檢查Customers表中有多少個不同的CustomerID? – GurV

+2

查詢中存在另一個錯誤:對於沒有訂單的客戶,COUNT(*)應該是COUNT(o.CustomerID)或類似的值,以便計數0而不是1。 –

0

正確的SQL是:

SELECT c.CustomerID, count(o.CustomerID) AS TotalOrders, 
     sum(count(o.CustomerID)) over() as TotalTotalOrders 
FROM Customers c LEFT JOIN 
    Orders o 
    ON c.CustomerID = o.CustomerID AND o.FiscalYear = '2016' 
GROUP BY c.CustomerID; 

TotalTotalOrders應該是所有的訂單(或至少只是那些有效的客戶ID)。

0

這將列出所有客戶,無論他們是否有任何訂單,無論下訂單的年份爲。然後sum將計算2016年所有訂單,忽略其餘,並返回一個整數(即它永遠不會爲空)。

SELECT 
    c.CustomerID 
    ,sum(case when o.FiscalYear = '2016' then 1 else 0 end) AS TotalOrders 
FROM Customers c 
LEFT JOIN Orders o 
ON c.CustomerID = o.CustomerID 
GROUP BY c.CustomerID 
+0

呃,它的表現不如@ Gurwinder的回答,但是如果您的要求發生變化,它會提供更大的靈活性。 –