2017-01-22 8 views
-1

Ich versuche, eine SQL-Frage zu Revisionszwecken zu beantworten, aber ich kann nicht herausfinden, wie es funktioniert. Die Tabellen in Frage sind:Schwierigkeiten mit SQL-Unterabfrage

Tables in question

Die Frage mich fragt, einen SQL-Befehl zu schreiben, für jeden Mitarbeiter angezeigt werden, die von allen Reisen von mehr als 100 eine Gesamtlänge hat, den Namen des Mitarbeiters und die Gesamtzahl von den Litern, die vom Mitarbeiter auf allen Fahrten verbraucht werden (die Anzahl der Liter für eine Fahrt ist EntfernungInKm/kmPerLitre).

Bisher habe ich mit Anfang einige Variationen von Code versucht:

SELECT 
    name, TravelCost.distanceInKm/Car.kmPerLitre AS "Cost in Litres" 
FROM 
    Employee, Car, TravelCost 
WHERE 
    Employee.id = TravelCost.employeeID 
    AND Car.regNo = TravelCost.carRegNo 

An diesem Punkt ist ich ein bisschen stecken, wäre jede Hilfe sehr dankbar, danke!

+0

Ich entfernte die inkompatiblen Datenbank-Tags. Bitte markieren Sie die Datenbank, die Sie wirklich verwenden. –

+0

[Schlechte Angewohnheiten zu treten: Verwenden von alten JOINs] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins. aspx) - Diese alte * durch Kommas getrennte Liste von Tabellen * style wurde durch die * richtige * ANSI 'JOIN'-Syntax im ANSI - ** 92 ** SQL Standard (** 25 Jahre **) und ihre ersetzt Gebrauch wird davon abgeraten –

Antwort

3

Nie Kommas in der FROM Klausel. Immer Verwenden Sie die richtige, standardmäßige, explizite JOIN Syntax.

Du eine GROUP BY und HAVING fehlt:

SELECT e.name, SUM(tc.distanceInKm/c.kmPerLitre) AS "Cost in Litres" 
FROM Employee e JOIN 
    TravelCost tc 
    ON e.id = tc.employeeID JOIN 
    Car c 
    ON c.regNo = tc.carRegNo 
GROUP BY e.name 
HAVING SUM(tc.distanceInKm) > 100; 
+0

Danke, funktioniert perfekt, ich hatte vorher etwas sehr ähnliches versucht, aber hatte die SUM in der SELECT-Klausel verpasst. – Tom

+0

Bessere Perfomant-Abfrage könnte sein, wenn wir mit gruppierten Daten von Kriterien mit CTE verbunden oder anwenden –

1

Usegroup by- und having-Klausel

SELECT NAME, 
     Sum(TravelCost.distanceInKm/ Car.kmPerLitre) AS "Cost in Litres" 
FROM Employee 
     INNER JOIN TravelCost 
       ON Employee.id = TravelCost.employeeID 
     INNER JOIN Car 
       ON Car.regNo = TravelCost.carRegNo 
GROUP BY NAME 
HAVING Sum(distanceInKm) > 100 
1

Sie müssen alle Tabellen verknüpfen und die Summe von Litern wie diese zu finden:

select 
    e.*, 
    sum(distanceInKm/c.kmPerLitre) litres 
from employee e 
inner join travelcost t 
on e.id = t.employeeId 
inner join car c 
on t.carRegNo = c.regNo 
group by e.id, e.name 
having sum(t.distanceInKm) > 100; 

Außerdem müssen Sie von ID-Gruppe statt nur Namen, wie die anderen Antworten vermuten lassen. Es kann mehrere Mitarbeiter mit demselben Namen geben.

Verwenden Sie außerdem explizite JOIN-Syntax anstelle von älterer komma-basierter Syntax. Es ist modern und klarer.

-2
-- **How fool am I! How arrogant am I! I just thought `sum(tc.distanceInKm/c.kmPerLitre)` 
-- may have a problem, since a employee may have multiple cars,and car's kmPerLitre is differenct. 
-- However there is no problem, it's simple and right! 
-- The following is what I wrote, what a bloated statement it is! ** 

-- calcute the total number of litres used by the employee on all journeys 
select e.name, sum(Cost_in_Litres) as "Cost in Litres" 
from (
    select t.employeeID 
     -- calcute the litres used by the employee on all journeys group by carRegNo 
     , sum(t.distanceInKm)/avg(c.kmPerLitre) as Cost_in_Litres 
    from TravelCost t 
    inner join Car c 
     on c.regNo = t.carRegNo 
    where t.employeeID in 
    (-- find the employees who has a total distance from all journeys of more than 100 
    select employeeID 
     from TravelCost 
     group by employeeID 
     having sum(distanceInKm)> 100 
    ) 
    group by t.carRegNo, t.employeeID 
) a 
inner join Employee e 
    on e.id = a.employeeID 
group by e.id,e.name; 
Verwandte Themen