SQL Anweisung sum und max


#1

Hallo Leute,
ich habe ein SQL-Statement das leider noch nicht ganz richtig ist. Leider weiß ich nicht mehr wie es geht.

Ich habe eine Tabelle Punkte (Columbeschreibung):
TID, Choreo,Technik, Level,Gesamt

Dort hat man für jedes Column Punkte z.B.
(tid)1, (choreo)7, (technik)9,(level)10, (gesamt)3

Nun mein Statement

[SQL]select sum(Choreo + Technik + Level + Gesamt) as summe
from punkte inner join tanz on punkte.tid = tanz.tanzid
where wertung = 'NeueKlasse’
group by tid[/SQL]

Das SQL Statement ist richtig, liefert mir die Summe von einer Wertungsklasse (der "NeueKlasse).
Jetzt liefert es mir aber leider 100 Einträge, da es von der Wertungsklasse “NeueKlasse” mehrere Einträge gibt.
Ich möchte jetzt gerne dass ich aber nur den Höchsten Eintrag, also mit der höchsten Summe zurückbekomme, im schlimmsten Falle, wenn zwei gleich sind, dann zwei zurück bekomme.

D.h. ich möchte gerne so etwas:
[SQL]select max(select sum(Choreo + Technik + Level + Gesamt) as summe
from punkte inner join tanz on punkte.tid = tanz.tanzid
where wertung = ‘NeueKlasse’ group by tid)
from punkte[/SQL]

Geht natürlich nicht, wie muss ich nun das Umschreiben, dass ich von meiner Query nur die maximalste bekomme?

Danke sehr


#2

Mag in Deinem speziellen Fall nicht gehen. Pauschal kann man nicht sagen, dass Subselects der falsche Ansatz sind. Im Gegenteil wird das für eineige Datenbanken als Lösung (bspw. bei Stackoverflow) vorgeschlagen. Welche Datenbank benutzt Du? Das würde die google-Suche erheblich veinfachen. Und man würde auch nur Lösungen vorschlagen, die bei Dir funktionieren. Da gibt es von DB zu DB nämlich ggf. Syntaxunterschiede.


#3

[QUOTE=nillehammer;28953]Mag in Deinem speziellen Fall nicht gehen.[/QUOTE]

Frustrierend :-/

MySQL in Verwendung.


#4

Habe gerade kein MySQL zum Testen, aber folgendes müsste gehen:
[SQL]
SELECT SUM(Choreo + Technik + Level + Gesamt) AS summe
FROM punkte
INNER JOIN tanz ON punkte.tid = tanz.tanzid
WHERE wertung = 'NeueKlasse’
GROUP BY tid
ORDER BY summe DESC
LIMIT 1
[/SQL]
Edit: Habe gerade die ORDER BY-Klausel korrigiert es muss summe heißen und nicht -wie ursprünglich- punkte!


#5

Richtungsvorschlag
[SQL]select max(summe) from
(select tid, sum(Choreo + Technik + Level + Gesamt) as summe
from punkte inner join tanz on punkte.tid = tanz.tanzid
where wertung = ‘NeueKlasse’ group by tid) as sumTable
[/SQL]
http://dev.mysql.com/doc/refman/5.0/en/from-clause-subqueries.html

damit kannst du aber nur generell die Summe bestimmen, mehrere max-Einträge sind schwieriger,
vielleicht nur mit

[SQL]select summe, tid from
(select tid, sum(Choreo + Technik + Level + Gesamt) as summe
from punkte inner join tanz on punkte.tid = tanz.tanzid
where wertung = ‘NeueKlasse’ group by tid) as sumTable
where summe = max(
select sum(Choreo + Technik + Level + Gesamt)
from punkte inner join tanz on punkte.tid = tanz.tanzid
where wertung = ‘NeueKlasse’ group by tid
)
[/SQL]
ich hoffe aber noch auf intelligenteres von anderen


#6

nillehammers Statement sieht für mich auch richtig aus. Hat aber den Nachteil, dass bei “Gleichstand” ebenfalls nur ein Eintrag zurückgegeben wird.


#7

Was im Moment keine Rolle spielt, da die Summe die einzig angezeigte “Spalte” des Statements ist, also bei Gleichstand mehrmals derselbe Wert untereinander stehen würde. Für einen späteren Ausbau (evtl. Zusätzliche Anzeige der Wertung, Tanz-Id ö.ä.) aber auf jeden Fall zu bedenken! Da dann entweder den ermittelten Max-Summenwert in der Having-Klausel eines zweiten Statements verwenden. Oder das LIMIT hochsetzen.


#8

Guten Morgen, danke für eure Hilfe,
der Ansatz von nillehammer war schon sehr gut, nur wie richtig erkannt von cmrudolph dass dann Gleichwertige nicht angezeigt werden. Da ich die Tid auch haben möchte. Also Augabe z.B.
Tid | Wert
1 1020
4 1020

Dann habe ich mir das zweite Beispiel von SlaterB angesehen, das müsste doch eigentlich funktionieren, leider stimmt das Statement bei mir überhaupt nicht.
Zuerst sagt er dass er bei Zeile 7 einen Fehler hat (das ist die Zeile Max(Select Sum(Choreo + Technik…)
Dann nehme ich das Max raus erkennt er Choreo nicht mehr, auch wenn ich schreibe punkte.choreo checkt er es nicht.

Jetzt habe ich die etwas langsamere Methode gewählt. Jetzt muss die Auswertung leider mein Java-Programm machen. Alle Werte holen und dann das erste mit dem zweiten Wert vergleichen und nachsehen ob sie “Gleichwertig” sind usw.

Danke für eure Hilfe
Wünsche euch einen schönen Tag


#9

Ich kann jetzt nicht garantieren, dass es funktioniert, aber wie wäre es mit:

[sql]SELECT SUM(Choreo + Technik + Level + Gesamt) AS summe
FROM punkte
INNER JOIN tanz ON punkte.tid = tanz.tanzid
WHERE wertung = 'NeueKlasse’
GROUP BY tid
HAVING summe = MAX(summe)[/sql]