SQL Spalte aufsummieren, wenn...

Mika911

Captain
Registriert
Juni 2007
Beiträge
3.351
Hallo CBler,
ich hab eine Sql-Anfrage, bei der ich nicht weiter komme.
Die Aufgabenstellung lautet:
Liste aller Studirenden(Name, Vorname), die mindestans 6 SWS belegen.
Nun bekomme ich mit der abfrage

SELECT s.name, s.vorname, s.matrnr, l.lvbezeichnung, l.lvdauer
FROM studierende s, besuchen b, lv l
WHERE s.matrnr = b.matrnr
AND b.lvnr = l.lvnr;

Eine Tabelle in der Daten stehen wie z.B.
Name-Vorname-Matrnr-Lvbezeichnung-lvdauer
nap - a - 123- Informatik- 5
nap - a - 123 - BWL - 3
pro - c - 113 - Informatik - 5

Ich müsste nun, nach Matrikelnummer die lvdauer zusammen fassen und dann
(wohl via sub-select?!) diejenigen mit >5 in einer neuen tabelle
mit Name und Vorname ausgeben.
Dies bekomme dies mit sum() jedoch nicht hin, hat jemand einen ansatz für mich?
Ich bin noch nicht besonderst Syntaxsicher.

Mfg
Mika
 
ich denke das ist ne Übungsaufgabe oder?
also bitte keine Lösungen posten, sonst geht der Effekt verloren :D
GROUP BY ... schau dir mal an was diese Funktion macht.
 
Tabellen sollten immer per "JOIN" und niemals per "WHERE" verbunden werden.
Das ist schneller und übersichtlicher.

PHP:
SELECT
	 s.name
	,s.vorname
	,s.matrnr
	,SUM(l.lvdauer) as Stunden
FROM studierende s
INNER JOIN besuchen b
		ON s.matrnr = b.matrnr
INNER JOIN lv l
		ON b.lvnr = l.lvnr
GROUP BY 
	 s.name
	,s.vorname
	,s.matrnr
HAVING SUM(l.lvdauer) >= 6
 
Zuletzt bearbeitet:
Vielen Dank,
das mit dem Join lass ich erstmal noch, trozdem danke für den Tip.
@Schlummi: Da geb ich dir recht, davon halte ich selber nicht viel, auch wenn yxcv schon
zu viel gespoilert hat.
Ich hab das "Group by" leider etwas falsch benutzt, sodass ich immer einen Fehler bekam.
Nun hab ich eine richtige lösung.
SELECT s.name, s.vorname
FROM studierende s, besuchen b, lv l
WHERE s.matrnr = b.matrnr
and b.lvnr = lvlvnr
GROUP BY s.name, s.vornamme
HAVING SUM(l.lvdauer) >5;

Tipfehler ohne Gewähr.
Nochmals Danke.
 
Mika911 schrieb:
das mit dem Join lass ich erstmal noch, trozdem danke für den Tip.
Warum möchtest du absichtlich falsches lernen und dir das Leben unnötig schwer machen?

JOIN ist wirklich nicht so schwer wie du befürchtest ;)
PHP:
SELECT Nachname, Vorlesung
FROM TabStudenten 
(INNER/LEFT/RIGHT) JOIN TabVorlesung
	ON TabStudenten.id = TabVorlesung.Studenten_id
  • INNER JOIN = der gesuchte Werte muss in der Tabelle links(Studenten) und rechts(Vorlesung) vom JOIN vorhanden sein.
    Also nur Studenten mit Vorlesung.
  • LEFT JOIN = alle Daten links(Studenten) vom JOIN werden angezeigt, egal ob dieser auch in der rechten Tabelle (Vorlesung) existiert.
    Also alle Studenten, auch die ohne Vorlesung.
  • RIGHT JOIN = alle Daten rechts(Vorlesung) vom JOIN werden angezeigt, egal ob dieser auch in der linken Tabelle (Studenten) existiert
    Also alle Vorlesungen, egal ob Studenten dabei sind oder nicht.

Mit deiner Verbindung per WHERE hast du immer das "INNER" Join.

Mika911 schrieb:
HAVING SUM(l.lvdauer) >5;
Die Fragestellung lautete doch "mindestens 6".
Bei deiner Abfrage hättest du auch Studenten mit nur 5,01 Stunden dabei.
 
Zuletzt bearbeitet:
Der Datentyp ist glaub ich Numeric(2,0) somit gibts da kein 5,99, sonst hast du natürlich wieder recht.
100%-richtig ist das >=6.
 
Zurück
Oben