Ergebnis 1 bis 9 von 9

Thema: min/max/avg einer gruppierten Summe

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Avatar von Gremlin
    Registriert seit
    05.07.2006
    Beiträge
    5.206

    min/max/avg einer gruppierten Summe

    Ich steh mal wieder vor einem Problem


    Code:
    Tabelle: verlosung
    
    uid  |   von  |  bis
    ----+-------+-----
    1    |    0    | 100
    1    |  101   | 203
    So ich möchte nun von jedem User die Punkte, Punkte ist die Differenz aus von und bis, folgende Abfrage hab ich dafür gemacht:

    Code:
    SELECT 
              COUNT(*) AS teilnehmer, 
              SUM(bis-von) AS gesamt, 
              MIN(bis-von) AS min, 
              MAX(bis-von) AS max, 
              AVG(bis-von) AS avg 
    FROM 
              verlosung 
    GROUP BY 
              uid 
    LIMIT 1
    Das sollte theoretisch folgendes ausgeben:

    teilnehmer = 1
    gesamt = 202
    min = 202
    max = 202
    avg = 202

    Ausgeben tut es jedoch:

    teilnehmer = 2
    gesamt = 202
    min = 100
    max = 102
    avg = 101

    Also das GROUP BY findet hier wohl keine Anwendung *grübel*
    Diskutiere nie mit Idioten - sie holen Dich auf ihr Niveau und schlagen Dich dort mit Erfahrung!



  2. #2
    Zu dem COUNT() kann ich ja Stellung nehmen:

    COUNT zählt bei GROUP BY nicht mehr die gesamten Zeilen einer Tabelle, sondern nur noch die Zeilen innerhalb einer Gruppe

    Mfg
    Sebmaster


  3. #3
    Erfahrener Benutzer Avatar von Gremlin
    Registriert seit
    05.07.2006
    Beiträge
    5.206
    COUNT zählt bei GROUP BY nicht mehr die gesamten Zeilen einer Tabelle, sondern nur noch die Zeilen innerhalb einer Gruppe
    Das ist es doch was ich möchte *grübel* ein User soll nicht 2x als Teilnehmer gelten, sondern nur 1x *think*
    Diskutiere nie mit Idioten - sie holen Dich auf ihr Niveau und schlagen Dich dort mit Erfahrung!



  4. #4
    Zitat Zitat von cdp Beitrag anzeigen
    Das ist es doch was ich möchte *grübel* ein User soll nicht 2x als Teilnehmer gelten, sondern nur 1x *think*
    Es wird trotzdem nur innerhalb einer Gruppe gesucht.

    Pro Gruppe wird dir eine Zeile ausgegeben, die dir alle Zeilen INNERHALB der Gruppe zählt.

    => COUNT zählt nicht die Groups, sondern die Zeilen innerhalb der Groups

    Mfg
    Sebmaster


  5. #5
    Erfahrener Benutzer
    Registriert seit
    11.01.2007
    Beiträge
    278
    Also ich verstehe eine Sache nicht

    Das sollte theoretisch folgendes ausgeben:

    teilnehmer = 1
    gesamt = 202
    min = 202
    max = 202
    avg = 202
    Warum denn das?

    SUM(bis-von) :
    SUM(303-101) = 202 Das ist soweit noch klar.

    MIN(bis-von) = 202??? MIN sucht den Datensatz ,mit dem kleinsten Spalten-Wert heraus. Und das halt innerhalb der betroffenen Datensätze von GROUP BY. MAX und AVG macht im Prinzip genau das gleiche.

    Ich spinn das mal weiter, um zu schauen, ob ich, das, was du haben möchtest, richtig verstehe :

    ---------------------
    | uid | von | bis |
    ---------------------
    | 1 | 0 | 100 |
    | 1 | 101 | 203 |
    | 2 | 30 | 150 |
    | 2 | 0 | 200 |
    | 3 | 100 | 300 |

    Was genau erwartest du dann für eine Anzeige?

    Etwa das :

    teilnehmer : 3
    gesamt : 953 - 231 = 722 ?
    min : [Uid3 = 200], [Uid2 320], [Uid1: 202] also 200 ?
    max : dementsprechend dann 320 ?
    avg : (200+320+202) / 3 = 241 ?

    Oder etwas ganz anderes?

    Bei obigem Beispiel wirst du das wahrscheinlich mit einer einzigen Abfrage nicht lösen können. Zumindest würde mir nichts passendes dazu einfallen. Oder liege ich falsch ?

  6. #6
    Erfahrener Benutzer Avatar von SebbyPHM
    Registriert seit
    17.07.2006
    Beiträge
    844
    Zitat Zitat von cdp Beitrag anzeigen
    Code:
    SELECT 
              COUNT(*) AS teilnehmer, 
              SUM(bis-von) AS gesamt, 
              MIN(bis-von) AS min, 
              MAX(bis-von) AS max, 
              AVG(bis-von) AS avg 
    FROM 
              verlosung 
    GROUP BY 
              uid 
    LIMIT 1
    Warum machst du ein GROUP BY uid, und ein COUNT(*) AS teilnehmer?

    -->

    Code:
    SELECT 
              COUNT(uid) AS teilnehmer, 
              SUM(bis-von) AS gesamt, 
              MIN(bis-von) AS min, 
              MAX(bis-von) AS max, 
              AVG(bis-von) AS avg 
    FROM 
              verlosung 
    LIMIT 1
    ??
    Mit freundlichem Gruß
    SebbyPHM




  7. #7
    Zitat Zitat von SebbyPHM Beitrag anzeigen
    Code:
    SELECT 
              COUNT(uid) AS teilnehmer, 
              SUM(bis-von) AS gesamt, 
              MIN(bis-von) AS min, 
              MAX(bis-von) AS max, 
              AVG(bis-von) AS avg 
    FROM 
              verlosung 
    LIMIT 1
    ??
    Da kommt als Teilenehmer (bei Grmlins Beispiel) aber 2 raus, obwohls 2x die selbe uid ist und Grmelin dann das nur als einen zählen will


  8. #8
    Erfahrener Benutzer
    Registriert seit
    11.01.2007
    Beiträge
    278
    Jetzt verstehe ich erst das Prinzip von der Tabelle glaub ich. Das sollen jeweils die Positionen sein, die der User jeweils hält. Naja, ändert ja nicht viel, außer das ich im obigen Beispiel etwas abstrakte Werte angegeben habe.

    Nehmen wir mal das Beispiel :

    1 | 0 | 100
    1 | 101| 203
    2 | 300 | 330
    2 | 340 | 410
    3 | 500 | 560

    Also eine Abfrage für :

    1.) Gesamtanzahl der Teilnehmer
    2.) Gesamtanzahl von Positionen im System
    3.) Anzahl der Positionen, die der User mit den meisten Positionen insgesamt hält
    4.) Anzahl der Positionen, die der User mit den wenigsten Positionen insgesamt hält
    5.) Die Anzahl der Positionen, die jeder User durchschnittlich hält

    Mittlerweile ist mir da auch etwas zu eingefallen :

    Code:
     SELECT COUNT( DISTINCT uid ) AS teilnehmer, SUM( bis - von ) AS gesamt, MAX( (
    
    SELECT SUM( bis - von )
    FROM verlosung
    GROUP BY uid
    ORDER BY bis - von DESC
    LIMIT 1 )
    ) AS max, MIN( (
    
    SELECT SUM( bis - von )
    FROM verlosung
    GROUP BY uid
    ORDER BY bis - von ASC
    LIMIT 1 )
    ) AS min
    FROM verlosung
    Das AVG schenken wir uns in der Abfrage, weil das ja eigentlich (gesamt/teilnehmer) sein sollte.

    Richtig?^^

  9. #9
    Erfahrener Benutzer Avatar von Gremlin
    Registriert seit
    05.07.2006
    Beiträge
    5.206
    @VMS1
    Genau so ist es . Super, danke dir!
    Diskutiere nie mit Idioten - sie holen Dich auf ihr Niveau und schlagen Dich dort mit Erfahrung!



Ähnliche Themen

  1. Summe berechnen Doppler
    Von the-carnage im Forum Support zu Addons & Erweiterungen
    Antworten: 15
    Letzter Beitrag: 17.05.2015, 13:11
  2. Ich bekomme die summe nicht ausgelesen
    Von brokerp25 im Forum Support zum VMSone
    Antworten: 7
    Letzter Beitrag: 01.08.2014, 16:45
  3. StatSpicker mit Summe aller Auszahlungen - wie?
    Von Rallef im Forum Support zu Addons & Erweiterungen
    Antworten: 6
    Letzter Beitrag: 19.03.2009, 17:32
  4. [S] Hilfe bezüglich einfügen einer Tabelle auf einer VMS Seite
    Von st.pauliblau im Forum [HD] Programmieren
    Antworten: 10
    Letzter Beitrag: 30.09.2007, 18:49
  5. wiederbelebung einer währung
    Von dude32 im Forum Ref & Werberhandel
    Antworten: 0
    Letzter Beitrag: 29.12.2006, 16:24

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •