Announcement

Collapse
No announcement yet.

SELECT kumulieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SELECT kumulieren

    Guten Tag,

    Ich würde gerne innerhalb einer Gruppe a die Zahlen aufwärts oder abwärts kumulieren. Z.B.

    Tabelle t
    1. a b c
      x r 1
      x r 3
      x r 3
      x s 2
      y r 2
      y s 1


    SELECT a,b, COUNT(*), SUM(c), kumulieren alle c innerhalb eines a
    FROM t
    GROUP BY a,b

    Resultat
    1. x r 3 7 7
      x s 1 2 9
      y r 1 2 2
      y s 1 1 3


    Gibt es eine Funktion dazu oder muss man ein komplexeres SELECT erstellen? Bin froh um hinweise.
    Besten Dank
    giordano

  • #2
    Hallo,

    zu einer fortlaufenden Summe in MySQL habe ich mal in meinem Blog etwas geschrieben. Evtl. hilft dir das weiter.
    Die Rücksetzung beim Gruppenwechsel kann allerdings etwas "tricky" werden

    Ein Reportgenerator ist dafür in jedem Fall besser geeignet als reines SQL!

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk,
      Besten Dank für Deine Hilfe. Das ist schon mal ein guter Start. Deine Anleitung ist auch sehr gut gemacht.
      Gruss
      giordano

      Comment


      • #4
        Hallo Falk,
        Die Rücksetzung geht mit:
        @set @x;
        SELECT a,b, if(b=0,@x:=0,@x:=@x+c)
        FROM t
        GROUP a,b

        weil das erste b immer mit 0 beginnt. Das vereinfacht die Angelegenheit. Nicht schlecht wäre es, wenn es einen Indikator gibt für den Gruppenbeginn, dann könnte man es allgemeiner halten. Ein andere Wunsch wäre noch, wenn man es umgekehrt kumulieren könnte.
        Gruss
        giordano

        Comment


        • #5
          Ich habe nun eine elegante Lösung gefunden (aus Joe Celkos, SQL for Smarties):

          SELECT a,b, SELECT( SUM(c)
          FROM t AS t1
          WHERE t0.a=t1.a AND t0.b>=t1.b
          FROM t AS t0

          Ich habe es getestet und es funktioniert.
          Gruss
          giordano

          Comment


          • #6
            Originally posted by giordano View Post
            ...Ich habe es getestet und es funktioniert.
            Das glaube ich nicht! Es gibt mindestens einen Syntaxfehler wegen einer fehlenden schliessenden Klammer.
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Tja, das stimmt. Und zwar wegen einen Fehler, den Du erwähnst. Ich habe es mit meinen Daten überprüft, dessen Variablen lange und verwirrend sind.


              SELECT a,b, SELECT(SUM(c)
              ....................FROM t AS t1
              ....................WHERE t0.a=t1.a AND t0.b>=t1.b ) AS cum
              FROM t AS t0

              Ich hatte keine Ahnung, dass man einen Select im Select anlegen kann. Das eröffnet natürlich viele Möglichkeiten. Das Buch von Celko ist wirklich empfehlensert.
              Besten Dank für Deine Gründlichkeit
              giordano

              Comment


              • #8
                Originally posted by giordano View Post
                ...Ich hatte keine Ahnung, dass man einen Select im Select anlegen kann. Das eröffnet natürlich viele Möglichkeiten.
                Allerdings sollte man sich auch der Tragweite bewusst sein. Wirklich empfehlenswert ist dies nur, wenn die Ergebnissmenge nicht allzuviele Datensätze enthält, da dieses Subselect für JEDE Zeile ausgeführt werden muß. Es kommen also ganz schnell ein paar Sekunden Ausführungszeit zusammen.

                Ich will ja nicht rummäkeln, aber so wie das SQL dasteht ist das in meinen Augen immer noch falsch. SELECT ist keine Funktion, die öffnende Klammer muß also noch VOR das SELECT.
                [highlight=sql]
                SELECT a, b, (
                SELECT SUM(c)
                FROM t AS t1
                WHERE t0.a = t1.a AND t0.b >= t1.b ) AS cum
                FROM t AS t0
                [/highlight]

                Hinweis: Formatierung von SQL in Beiträgen

                Gruß Falk
                Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                Comment


                • #9
                  Hallo Falk,
                  Danke für die Korrektur. Im Original habe ich es korrekt gemacht (korrekt abgeschrieben). Im Beispiel hier habe ich es aus den Kopf gemacht. Dein Hinweis, dass das innere Select keine Funktion ist, macht für mich das ganze noch verständlicher. Für meine Zwecke (ca. 5000 Zeilen) ist die Zeit kein Problem. Danke auch für den SQL-Formatierungshinweis.
                  giordano

                  Comment

                  Working...
                  X