2017-06-15 117 views
1

問題:每位顧客的名字是什麼,他們放置了多少訂單,以及他們訂購了多少比薩餅?Aggregate SQL Query

enter image description here

以下是我有:

SELECT DISTINCT FirstName, LastName, Count(Orders.ID) AS NumberOfOrders, Count(Pizza.ID) AS NumberOfPizzas 
FROM ((Customer LEFT OUTER JOIN Orders ON Customer.ID = Orders.CustomerID) LEFT OUTER JOIN Pizza ON Orders.ID = Pizza.OrderID) GROUP BY Customer.ID; 

這是它打印:

enter image description here

訂單的數量是錯誤的,它應該是1-0 -2-1。

當我從「Orders.ID = Pizza.OrderID」更改爲「Pizza.OrderID = Orders.ID」時,它將打印出兩列的訂單數量,而不是兩列的比薩餅數量。

我該如何解決這個問題?

+0

請不要使用圖片;將材料複製到問題中並將其格式化爲「代碼」。將材料複製到問題中,忽略預覽。確保它看起來正確並且不包含標籤。選擇它,並用編輯框上方的** {} **按鈕縮進。現在看預覽並檢查它仍然可以。如果你願意,你可以在示例之前自行添加一個包含'<! - language:lang-none - >'的不帶縮進的行。你的屏幕截圖幾乎難以辨認 - 至少在我這樣的古董眼中。 –

回答

0

將其更改爲count(distinct orders.id)

1

它看起來像你採取一個類和學習,所以我要告訴你一些額外的反饋。首先,如果您要將表格連接在一起,最好完全限定您選擇的每個字段,即使它僅適用於單個表格(例如FirstName變爲c.FirstName)。它有助於自我記錄你的代碼。

其次,如果不是同一件事,那麼在多個表中有一個名稱相同的字段的字段是一個糟糕的做法。具體而言,Customer.ID應該是Customer.CustomerID,而Order.ID應該是Order.OrderID。同樣,這不僅可以幫助自我記錄您的查詢,還可以幫助您記錄所有其他需要使用這些表的開發人員。這個ID字段代表的是什麼更清晰。

連接(至少在MySQL中)不必全部用圓括號包裝。這樣做時,你不必導致令人沮喪的錯字錯誤,並使你和其他人閱讀困難。

最後,對於99%的情況,您應該總是在最終產品中使用ORDER BY子句,因爲您決不能依賴該程序將您的結果返還給您。爲用戶選擇合乎邏輯的東西。在這種情況下,按姓氏和名字排序非常直觀。不要做那些讓用戶煩惱的事情!

現在,在你的具體問題上,它非常簡單。您需要在查詢中使用COUNT(DISTINCT ...)。考慮到所有上述因素,我重新排序了查詢以提高可讀性。我希望這有幫助!

SELECT c.FirstName, c.LastName, COUNT(DISTINCT o.id) AS NumberOfOrders, 
    COUNT(p.ID) AS NumberOfPizzas 
FROM Customer c 
    LEFT JOIN Order o ON o.CustomerID = c.ID 
    LEFT JOIN Pizza p ON p.OrderID = o.ID 
GROUP BY c.ID 
ORDER BY c.LastName, c.FirstName