begrenztes Summieren in einer Tabelle
-
Hallo Leute,
ich möchte gerne nur die 3 höchsten Werte eine zu gehörigen id aufaddieren.
In meine Tabelle sind eben zum Teil mehr als 3 Werte einer id zu geordnet, bei denen nur die 3 besten gezählt werden müssen.Hat da wer nen Lösungsvorschlag?
Hab jetzt nur mit sum so gearbeitet!
cu
Hexa
-
Hallo,
was hast du für ein Datenbanksystem?
In meine Tabelle sind eben zum Teil mehr als 3 Werte einer id zu geordnet, bei denen nur die 3 besten gezählt werden müssen.
Zeig uns mal ein kleines Beispiel.
MfG
-
Achso, sry, total verplant: mysql
Meine Tabelle:
s_id
d_id
punkteist dann so gefüllt:
s_id 4
d_id 10
punkte 400s_id 4
d_id 5
punkte 300s_id 4
d_id 6
punkte 100s_id 4
d_id 2
punkte 200s_id 5
d_id 9
punkte 90s_id 5
d_id 3
punkte 10s_id 5
d_id 7
punkte 50s_id 5
d_id 1
punkte 300Jetzt sollten 400,300 & 200 bzw. 90,50 & 300 zusammen addiert werden!
-
Zuerst ist es mal erforderlich das du diene Tabelle RDBMS-Konform machst.
Deine Datensätze sind nicht eindeutig.
-
Ich wüsste nicht, was ich jetzt da verändern sollte. Ansonsten läuft ja alles ohne Redundanzen. Das ist ja ne Fremndschlüsseltabelle nach der 3. NF!
-
Beim Sql-Server sollte dieses funktionieren:
SELECT SUM( t1.punkte ) FROM tab t1 WHERE EXISTS ( SELECT TOP 3 * FROM tab t2 WHERE t2.s_id = t1.s_id ORDER BY t2.punkte DESC ) GROUP BY t1.s_id
-
...und wenn du "s_id" ins Select aufnimmst, hast auch noch die spieler-id dabei.
-
Die Top n-Klausel wird für die Ausgabe der ersten n Reihen des Ergebnisses, die auf Grund eines Kriteriums ausgewählt wurden, verwendet.
Wählen Sie die 3 größten Verkäufe im Februar mit der Top n-Klausel.
select top 3 Umsatz, Artikel_ID, Filial_ID, Zeit from laufende_Verkaeufe2001 where Month( Zeit ) = 2 order by Umsatz desc
Die TOP n-Klausel kann mit Hilfe einer Unterabfrage simuliert werden, indem der Wert des Parameters n mit Hilfe eines Vergleichsoperators mit der Unterabfrage verglichen wird.
select Umsatz, Artikel_ID, Filial_ID, Zeit from laufende_Verkaeufe2001 vk1 where month(Zeit)=2 and 3 >(select count(*) from laufende_Verkaeufe2001 vk2 where vk2.Umsatz > vk1.Umsatz and month(Zeit)=2) order by Umsatz desc
Ich habe mit MySQL noch nichts gemacht. k.A. ob da eine TOP n - Klausel gibt.
Sonst musst du das Beispiel auf dein Problem ummünzen.
Bisher nur die halbe Wahrheit. Danach musst du noch summieren. Aber bisher klappt's bei mir nicht.Gibt es bei MySQL PROCEDUREs oder FUNCTIONs? So wie bei MS SQL - Server ?
EDIT: dann könnte man sich die TOP n - Funktion selber basteln.MfG
-
Sorry, hatte einen Denkfehler. Muss so aussehen:
SELECT SUM (t1.punkte) FROM tab t1 WHERE t1.d_id IN ( SELECT TOP 3 t2.d_id FROM tab t2 WHERE t2.s_id = t1.s_id ORDER BY t2.punkte DESC ) GROUP BY t1.s_id
-
Hexa schrieb:
Ich wüsste nicht, was ich jetzt da verändern sollte. Ansonsten läuft ja alles ohne Redundanzen. Das ist ja ne Fremndschlüsseltabelle nach der 3. NF!
Also ist d_id eindeutig?
Bitte das nächstemal die ganze Tabellendefinition.
dann wird auch die eindeutigkeit eines datensatzen klar
-
Erst mal vielen Dank für die Antworten!!!
Ich werds morgen gleich mal ausprobieren, aber jetzt erstmal schalfen.Unix-Tom schrieb:
Bitte das nächstemal die ganze Tabellendefinition.
dann wird auch die eindeutigkeit eines datensatzen klarok (:
-
Bei MySQL musst du mit dem "LIMIT"-Statement arbeiten:
SELECT SUM (t1.punkte) FROM tab t1 WHERE t1.d_id IN ( SELECT t2.d_id FROM tab t2 LIMIT 0, 3 WHERE t2.s_id = t1.s_id ORDER BY t2.punkte DESC ) GROUP BY t1.s_id
Ohne Gewähr!
-
Von der Logik her, verständlich und nachvollziehbar.
Leider erwartet mySQL nach IN nur ('value1','value2',....).
-
Dann versuch das mal:
SELECT SUM (t1.punkte) FROM tab t1 WHERE t1.d_id = ANY ( SELECT t2.d_id FROM tab t2 LIMIT 0, 3 WHERE t2.s_id = t1.s_id ORDER BY t2.punkte DESC ) GROUP BY t1.s_id