2017-07-26 8 views
0

Ich habe zwei Tabellen Orders und Customers. Orders enthält die folgenden Spalten: OrderID, CustomerID. Customers enthält Spalten: CustomerID, CustomerName. Ich habe ein paar Datensätze von Customers, die keine Bestellungen haben. Also möchte ich alle einzigartigen Kunden (auch wenn sie keine Bestellungen haben) und Bestellungen bekommen.SQL: Wie gilt distinct nur für eine Spalte aus vielen?

ich möchte es erhalten, indem Sie diese Abfrage mit:

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

Aber es OrderID Spaltenwerte durch CustomerName Werte ersetzen. Deshalb sollte ich die folgende Abfrage verwenden, um das gewünschte Ergebnis zu erhalten.

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 
); 

Gibt es Fehler in meiner ersten Abfrage? Ist es möglich, es zu beheben?

+0

Erste Beratung, Sie vermissen ein Komma "" nach dem select distinct (Kundenname) , Bestell-Nr., – DanieleO

+0

Deutliche Werke pro Reihe. Was würden Sie von einem Kunden erwarten, der mehr als eine Bestellung hat? –

+0

@ZoharPeled Es ist nur eine Beispielabfrage. Ich weiß, dass es bedeutungslos ist, aber ich möchte alle einzigartigen Kunden bekommen. Ich weiß, dass ein Kunde mehr als eine Bestellung erhalten kann. –

Antwort

3

OrderID wird mehr als einen Datensatz zurück, wenn Ein Kunde hat mehr als eine Bestellung.
DISTINCT funktioniert auf ganze Datensätze, nicht einzelne Felder, wenn es mehr als eine Bestellung für einen Kunden gibt es beide Datensätze - der Kunde wird der gleiche sein, aber die Bestell-ID ist unterschiedlich, so dass beide Datensätze unterschiedlich sind.

Wenn Sie COUNT die OrderID und Group die CustomerName Sie einzigartige Kunden bekommen und wie viele Aufträge sie gemacht haben:

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

Wenn Sie nur Kundennamen möchten, können Sie einfach 'SELECT CustomerName FROM Customers' verwenden –

0

Verwendung dieses:

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

Sie den Kundennamen zweimal mit und tatsächlich ist OrderId in Ihrem Fall dann die Alias ​​Spaltenname von Kundenname :)

+0

Ihre Abfrage gibt keine eindeutigen Kunden zurück. Ich habe Duplikate im Ergebnis. Sie können es in W3Schools SQL Editor versuchen. –

+0

Entschuldigung, ich habe dich falsch verstanden, du hast in deiner Frage nicht erwähnt, dass du die Anzahl der Bestellungen für JEDEN Kunden willst. Wie auch immer, Darrens Antwort ist die! –

0

Zu allererst Sie müssen verstehen, dass, wenn Sie Will OrderId col bedeutet, dass wenn Sie mehr als eine Bestellung pro Kunde haben - es wird die Zeilen duplizieren. so müssen Sie wählen: oder distinct Zeile pro Kunde oder show orderId Sie können nicht beide haben! (Dies ist ein logisches Problem, nicht SQL-Fehler) sowieso müssen Sie LEFT OUTER JOIN verwenden, um Kunden ohne Aufträge zu sehen.

ist eine Option, um die Aufträge zu zählen:

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; 

Die andere Option ist Doppelungen zu ermöglichen:

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