2016-09-24 3 views
-1

Eine scheinbar grundlegende Abfrage, die mir viele Probleme gibt. Ich hatte eine ähnliche abgeschlossen, aber scheint nicht richtig zu sein. Ich habe drei Tabellen Ich bin auf der Suche nach oben aus:SQL - Erhalten Durchschnittsgehalt für jede Abteilung und Anzahl der Kurse in dieser Abteilung gelehrt

CM - Beschreibt Abteilungen im Unternehmen mit Feldern DEPT, BUDGET

EM - beschreibt Mitarbeiter mit Feldern ID, NAME, DEPT, GEHALT

CR - beschreibt Lehrveranstaltungen mit Feldern cnum, Department, ID

Fett gedruckte Felder sind Primärschlüssel.

Ich dachte, dies sofort funktionieren würde, aber es kehrte nur eine Abteilung mit einem Durchschnitt für die enitre Gehaltsspalte:

select CM.Dept, CM.Budget, avg(EM.Salary), count(distinct(CR.Cnum)) 
from CM join EM join CR 
where CM.DEPT = EM.DEPT and CM.DEPT = CR.DEPT 
group by CM.DEPT; 
+1

Hint, 'Gruppe by' ... Verwenden Sie auch' join' über Kommas in der 'from' Klausel ... – sgeddes

+0

Ok, super! Es zeigt mehr Abteilungen und alles andere passend, aber jetzt gibt es nur 3 der 4 Abteilungen zurück. Mir ist aufgefallen, dass in der CR-Tabelle mit den Kursen die 4. Abteilung fehlt. Ich vermute, ich würde eine Unterabfrage für dieses tun müssen, anstatt das CM.Dept = CR.Dept einzuschließen? – TacoB0t

+0

Sie können nicht 'Join EM Join CR' verwenden, ohne die Spalten anzugeben, denen sie beitreten sollten. Es ist überraschend, dass Sie mit dem, was Sie gepostet haben, keinen Syntaxfehler bekommen haben. Entweder hast du es nicht benutzt oder MySQL ist ernsthaft kaputt. Die richtige Syntax lautet 'Join EM on EM.column = CM.column', wobei * column' durch die entsprechenden Spaltennamen ersetzt werden sollte. –

Antwort

0

Genau wie @sgeddes Hinweise Ihre Beschreibung von einigen festen Spalten eine Zusammenfassung Ihrer Daten impliziert (CM.Dept, CM.Budget). Dies bedeutet in SQL-Wörtern, dass die Gruppierung verwendet wird. Gruppieren nach muss angegeben werden, für welche Spalten, nach denen Sie gruppieren, und für alle anderen, die nicht in der Gruppierung sind, eine Aggregationsfunktion erforderlich ist. Weitere Informationen finden Sie unter http://www.w3schools.com/sql/sql_groupby.asp. Vielleicht etwas wie unten gezeigt. Diese Website spricht auch über die Verwendung von Join.

select CM.Dept, CM.Budget, avg(EM.Salary), count(distinct(CR.Cnum)) 
from CM, EM, CR 
where CM.DEPT = EM.DEPT and CM.DEPT = CR.DEPT 
group by CM.Dept, CM.Budget 

EDIT: Nachdem Sie das Konzept der „Gruppe“ zu verstehen und einige Arbeitscodes haben, wäre es beste Praxis sein, die ersetzen FROM mit Komma mit der JOIN-Syntax. Es würde ungefähr wie unten aussehen. JOIN wird auch im obigen Link erklärt.

select CM.Dept, CM.Budget, avg(EM.Salary), count(distinct(CR.Cnum)) 
from CM 
INNER JOIN EM 
ON CM.DEPT = EM.DEPT 
INNER JOIN CR 
ON CM.DEPT = CR.DEPT 
group by CM.Dept, CM.Budget 
+0

Großartig! Danke für die Klarstellung – TacoB0t

+0

Es ist eine Schande, dass Sie sich entschieden haben, mit einer antiquierten Syntax zu antworten, die vor zwei Jahrzehnten durch die JOIN-Syntax ersetzt wurde. In Ihrer FROM-Klausel sollte niemals ein Komma stehen. Wenn ja, dann machst du etwas sehr falsches (was etwas anderes ist, das auch von @sgeddes in dem von dir zitierten Kommentar erwähnt wird). –

+0

Ken, ich stimme zu, die Joinsyntax ist moderner und weit verbreitet und wird das zu meinem Beitrag hinzufügen. – ecolog

Verwandte Themen