2016-06-05 13 views
2

Ich habe drei Tabellen in meiner Datenbank Sales, SalesPeople und Appliances.Gespeicherte Prozedur Wählen Sie aus 3 Tabellen

Vertrieb

SaleDate EmployeeID AppID Qty 
---------- ---------- ----- ----------- 
2010-01-01 1412  150 1 
2010-01-05 3231  110 1 
2010-01-03 2920  110 2 
2010-01-13 1412  100 1 
2010-01-25 1235  150 2 
2010-01-22 1235  100 2 
2010-01-12 2920  150 3 
2010-01-14 3231  100 1 
2010-01-15 1235  300 1 
2010-01-03 2920  200 2 
2010-01-31 2920  310 1 
2010-01-05 1412  420 1 
2010-01-15 3231  400 2 

Verkaufspersonal

EmployeeID EmployeeName     CommRate BaseSalary SupervisorID 
---------- ------------------------------ ----------- ----------- ------------ 
1235  Linda Smith     15   1200  1412 
1412  Anne Green      12   1800  NULL 
2920  Charles Brown     10   1150  1412 
3231  Harry Purple     18   1700  1412 

Appliances

ID AppType    StoreID Cost   Price 
---- -------------------- ------- ------------- ------------- 
100 Refrigerator   22  150   250 
110 Refrigerator   20  175   300 
150 Television   27  225   340 
200 Microwave Oven  22  120   180 
300 Washer    27  200   325 
310 Washer    22  280   400 
400 Dryer    20  150   220 
420 Dryer    22  240   360 

Wie kann ich dieses Ergebnis erhalten? (Dies zeigt die Rentabilität jedes der bestellten Verkäufer von den profitabelsten zu den geringsten. Brutto ist einfach die Summe der Menge der verkauften Artikel multipliziert mit dem Preis. Provision berechnet sich aus dem Brutto abzüglich der Kosten für diese Artikel (dh von Menge * (Preis-Kosten)) Nettogewinn ist der Gesamtgewinn abzüglich Provision)

Name   Gross Commission Net Profit 
------------- ----- ---------- --------- 
Charles Brown 2380 83.5  751.5 
Linda Smith 1505 83.25  471.75 
Harry Purple 990 65.7  299.3 
Anne Green 950 40.2  294.8 

Mein Versuch:..

CREATE PROC Profitability AS 
    SELECT 
     sp.EmployeeName, (sum(s.Qty) * a.Price) as [Gross], 
     [Gross] - a.Cost, as [Commision], 
     SOMETHING as [Net Profit] 
    FROM 
     Salespeople sp, Appliances a, Sales s 
    WHERE 
     s.AppID = a.ID 
     AND sp.EmployeeID = s.EmployeeID 
    GROUP BY 
     sp.EmployeeName 
GO 

EXEC Profitability 
+1

[Schlechte Gewohnheiten zu treten: mit alten Stil JOIN] (http://sqlblog.com /blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - diese altmodische * durch Komma getrennte Liste von Tabellen * Stil wurde durch die * ersetzt richtige * ANSI 'JOIN'-Syntax im ANSI - ** 92 ** SQL-Standard (** vor mehr als 20 Jahren **) und deren Verwendung wird abgeraten –

Antwort

0

Einfache Regel: nie Kommas in der FROM Klausel . Immer verwenden explizite JOIN Syntax.

Neben Fixierung der JOIN Syntax, Ihre Abfrage benötigt einige andere Erweiterungen für die Aggregationsfunktionen:

SELECT sp.EmployeeName, sum(s.Qty * a.Price) as Gross, 
     SUM(s.Qty * (a.Price - a.Cost)) * sp.CommRate/100.0 as Commission, 
     SUM(s.Qty * (a.Price - a.Cost)) * (1 - sp.CommRate/100.0) as NetProfit 
FROM Sales s JOIN 
    Salespeople sp 
    ON sp.EmployeeID = s.EmployeeID JOIN 
    Appliances a 
    ON s.AppID = a.ID 
GROUP BY sp.EmployeeName sp.CommRate 
ORDER BY NetProfit DESC; 
Verwandte Themen