2017-07-26 36 views
0

我有兩個表OrdersCustomersOrders包含以下列:OrderID,CustomerIDCustomers包含列:CustomerIDCustomerName。我從Customers有幾條記錄沒有任何訂單。所以我想要獲得所有獨特的客戶(即使他們沒有訂單)和訂單。SQL:如何僅將多個列中的一列應用於不同的列?

我想通過此查詢獲得它:

SELECT DISTINCT(CustomerName) OrderID, Orders.CustomerID, CustomerName 
FROM Customers 
LEFT JOIN Orders ON Orders.CustomerID = Customers.CustomerID 
ORDER BY CustomerName; 

但通過CustomerName值替換OrderID列值。 那爲什麼我應該使用下面的查詢來獲得所需的結果。

SELECT OrderID, CustomerID, CustomerName 
FROM 
(
    SELECT DISTINCT(CustomerName) OrderID, Orders.CustomerID, CustomerName 
    FROM Customers 
    LEFT JOIN Orders ON Orders.CustomerID = Customers.CustomerID 
    ORDER BY CustomerName 
); 

在我的第一個查詢中是否有任何錯誤?可以修復它嗎?

+0

的第一個忠告,你錯過了一個逗號 「」 在SELECT DISTINCT(客戶名稱)後,訂單ID, – DanieleO

+0

只有每行不同的作品。對於有多個訂單的客戶,您希望看到什麼? –

+0

@ZoharPeled這只是一個示例查詢。我知道這是毫無意義的,但我想獲得所有獨特的客戶。我知道一個客戶可以獲得多個訂單。 –

回答

3

OrderID將返回多個記錄時一個客戶有多個訂單。
DISTINCT適用於整個記錄,而不是單個字段,因此如果客戶有多個訂單,它將顯示兩條記錄 - 客戶將是相同的,但訂單ID不同,因此兩個記錄都不同。

如果COUNT OrderID和GroupCustomerName你會得到唯一的客戶,他們已經多少訂單製作:

SELECT CustomerName, COUNT(OrderID) AS Count_Of_Orders 
FROM Customers LEFT JOIN Orders ON Orders.CustomerID = Customers.CustomerID 
GROUP BY CustomerName 
ORDER BY CustomerName 

enter image description here

+0

如果你只想要客戶名稱,你可以使用'SELECT CustomerName FROM Customers' –

0

使用本:

SELECT DISTINCT(CustomerName) as CusName, OrderID, Orders.CustomerID 
    FROM Customers LEFT JOIN Orders ON Orders.CustomerID = 
    Customers.CustomerID ORDER BY CusName; 

您正在使用的客戶名稱兩次,實際的OrderId是你的話,那麼客戶名稱的別名列名:)

+0

您的查詢不會返回唯一客戶。結果中有重複。你可以在w3schools sql編輯器中試試。 –

+0

對不起,親愛的,你錯了,你沒有提到你的問題,你想要每個客戶的訂單數量。無論如何,Darren的答案是唯一的答案! –

0

你要明白,首先,如果你想要OrderId col它意味着如果你將每個客戶有多個訂單 - 它將複製行。 所以你必須選擇:或不同的行,每個客戶或顯示orderId你不能讓他們兩個! (這是一個邏輯問題,而不是SQL錯誤) 反正你必須使用LEFT OUTER JOIN才能看到沒有訂單的客戶。

一個選項是計算訂單:

SELECT C.CustomerName, COUNT(0) AS NumOfOrders 
FROM Customers C 
LEFT OUTER JOIN Orders O ON O.CustomerID = C.CustomerID 
GROUP BY C.CustomerName 
ORDER BY C.CustomerName; 

另一種選擇是允許重複:

SELECT C.CustomerName, O.OrderID 
FROM Customers C 
LEFT OUTER JOIN Orders O ON O.CustomerID = C.CustomerID 
ORDER BY C.CustomerName; 
相關問題