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
    punkte

    ist dann so gefüllt:

    s_id 4
    d_id 10
    punkte 400

    s_id 4
    d_id 5
    punkte 300

    s_id 4
    d_id 6
    punkte 100

    s_id 4
    d_id 2
    punkte 200

    s_id 5
    d_id 9
    punkte 90

    s_id 5
    d_id 3
    punkte 10

    s_id 5
    d_id 7
    punkte 50

    s_id 5
    d_id 1
    punkte 300

    Jetzt 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 klar

    ok (:



  • 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
    

Anmelden zum Antworten