2016-11-30 21 views
2

Ich habe 4 Tabellen .... Mitarbeiter, Kunden, Bestellungen und Order_Info. Ich versuche, die 4 Tabellen innerlich zu verbinden, um die Bestellbeträge zusammenzufassen und die Mitarbeiterprovision basierend auf 7% zu berechnen. Ich bin sehr nah daran, das zu lösen, aber ich habe ein kleines Problem: Ich bekomme nicht alle Angestellten, weil weniger auftauchen als in meiner Employees Tabelle. Dies ist, wie ich zur Zeit meine Frage geschrieben:SQL 4 Tabellen innerer Join Abholsumme Nulls auch?

SELECT Employees.lName, Employees.fName, 
     SUM(quantOrdered * costEach) AS ttl_orders_value, 
     (SUM(quantOrdered * costEach) * .07) AS Commission 
FROM Customers 
INNER JOIN Employees ON Customers.empNumber = Employees.empNumber 
INNER JOIN Orders ON Customers.custNumber = Orders.custNumber 
INNER JOIN Order_Info ON Orders.ordNumber = Order_Info.ordNumber 
GROUP BY Employees.lName, Employees.fName 
ORDER BY Employees.lName, Employees.fName 

Ich wünsche alle Mitarbeiter zu erhalten, auch wenn ihre Provision und einen Gesamtumsatz gleich Null, was ich glaube, von NULLS berechnet werden.

Jede Hilfe, die meine Abfrage verbessert, würde sehr geschätzt werden!

+2

Versuchen Sie LEFT JOIN anstelle von INNER JOIN. – jarlh

+0

Hat nicht funktioniert es gab mir eine zusätzliche Zeile mit NULL in jeder Spalte gefüllt. Es ist sogar null, wo die lName und fName sind ... – finiteloop

+0

Fügen Sie einige Beispieltabellendaten und das aktuelle Ergebnis und das erwartete Ergebnis hinzu - alles als formatierten Text. – jarlh

Antwort

2

versuchen Sie dies:

SELECT Employees.lName, Employees.fName, 
     SUM(ISNULL(quantityOrdered,0) * ISNULL(priceEach,0)) AS ttl_orders_value, 
     (SUM(ISNULL(quantOrdered,0) * ISNULL(costEach,0)) * .05) AS Commission 
FROM Employees 
LEFT JOIN Customers ON Customers.empNumber = Employees.empNumber 
LEFT JOIN Orders 
    INNER JOIN OrderDetails ON Orders.ordNumber = OrderDetails.ordNumber 
ON Customers.custNumber = Orders.custNumber 
WHERE Employees.workTitle = 'Developer' 
GROUP BY Employees.lName, Employees.fName 
ORDER BY Employees.lName, Employees.fName 

Hinweis, ich habe geändert INNER JOIN LEFT JOIN Tabelle nur für Bestellungen, weil, wie Sie Mitarbeiter sagen Aufzeichnungen da sein sollte, sie nicht nur verknüpfte Aufträge haben.

Sie müssen möglicherweise NULL priceEach, costEach, quantityOrdered und quantOrdered Werte mit ISNULL ([field_name], 0) umbrechen, um richtige Ergebnisse für die Mitarbeiter zu erhalten, die keine Bestellungen haben.

+0

Das gab mir das gleiche Ergebnis – finiteloop

+0

Wie würde ich das Wrap durchführen? – finiteloop

+0

@finiteloop siehe die aktualisierte Antwort, ich habe die Verknüpfung zu OrderDetails geändert und auch ISNULL-Wrapper hinzugefügt. – andrews