2016-04-25 10 views
-1
SELECT DISTINCT 
    E.FirstName + ' ' + E.LastName [Full Name], 
    P.ProductName, 
    OD.Quantity 
FROM Employees E, 
     Products P, 
     [Order Details] OD, 
     Orders O 
WHERE 
    E.EmployeeID = O.EmployeeID 
    AND O.OrderID = OD.OrderID 
    AND OD.ProductID = P.ProductID 

Im Nordwind gibt wieder doppelte FullNames und ProductNames wegen der Quantity, die (wegen des Datums jedes Mal ausgeliefert) geändert wird.SQL Distinct Summe

Ich möchte nur einen Namen zu einem bestimmten ProductName mit der Gesamtmenge und nicht geteilt darstellen.

+4

Sie für [ 'GROUP BY'] suchen (https://msdn.microsoft.com/en-us/library/ms177673.aspx?f=255&MSPPError = -2147217396). Bitte verwenden Sie bitte die [ANSI-Syntax] (http://stackoverflow.com/questions/1599050/ansi-vs-non-ansi-sql-join-syntax) für Joins. –

+0

Warum lässt man 'Quantity' nicht aus dem' SELECT' heraus? –

+0

@BJMyers, könnten Sie genauer für dieses Beispiel sein? – N3wbie

Antwort

2

Sie müssen GROUP BY mit SUM verwenden:

SELECT 
    e.FirstName + ' ' + e.LastName AS [Full Name], 
    p.ProductName, 
    SUM(od.Quantity) AS [Quantity] 
FROM Employees e 
INNER JOIN Orders o 
    ON o.EmployeeID = e.EmployeeID 
INNER JOIN [Order Details] od 
    ON od.OrderID = o.OrderID 
INNER JOIN Products p 
    ON p.ProductID = od.ProductID 
GROUP BY 
    e.FirstName + ' ' + e.LastName, 
    p.ProductName 

Hinweis, Sie müssen stop using the old-style JOIN syntax.

0

denke ich, es ist eine gute Frage für die Diskussion war.

Korrekte Abfrage hängt immer von Ihrer tatsächlichen Anforderung ab.

Ich denke, Ihre Tabelle ist zu viel normalise.In einer solchen Situation werden die meisten von ihnen auch MitarbeiterID in order_detail Tabelle.

Gleichzeitig behalten die meisten von ihnen den Summenwert in der Auftragstabelle. Wie die Summe der Menge, Summe der Menge usw. pro Bestellnummer in der Auftragstabelle.

Sie können auch eine Ansicht ohne Aggregatfunktion erstellen, die alle Tabellen verbindet.

IMHO, Verwenden von Group By-Klausel auf so viele Spalten und das auch auf Varchar-Spalte ist eine schlechte Idee.

Versuchen so etwas,

;With CTE as 
(
SELECT 
    E.FirstName + ' ' + E.LastName [Full Name], 
    O.OrderID,od.qty,P.ProductName 
FROM Employees E 
inner join Orders O on E.EmployeeID = O.EmployeeID 
inner join [Order Details] OD on o.orderid=od.orderid  
inner join [Products] P on p.ProductID=od.ProductID 
) 
,CTE1 as 
(
select od.orderid, sum(qty) TotalQty 
from CTE c 
group by c.orderid 

) 

select c.[Full Name],c1.TotalQty, P.ProductName from cte c 
inner join cte1 c1 on c.orderid=c1.orderid