Bestimmte Werte innerhalb einer Gruppe addieren

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Bestimmte Werte innerhalb einer Gruppe addieren

    Hallo,

    ich benötige mal wieder einen Denkanstoß:
    Code:
    Tabelle:
    
    id|rechnungsnr|einzelpreis|d|
    1|100|10|1
    2|100|20|0
    3|100|5|1
    4|101|20|0
    5|102|10|1
    6|102|7|1
    Für jede Rechnung möchte ich die Summe der Preise erhalten, die in Spalte d den Wert 1 haben. Im Beispiel wäre dann folgendes Ergebnis gewünscht:

    Code:
    rechnungsnr|summe
    100|15
    101|0
    102|17

  • #2
    Hallo,

    nutze in den Spaltenreferenzen die sum-Funktion und gruppiere (GROUP BY) das Ergebnis nach der Rechnungsnummer.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Bei folgender Abfrage gehen aber die Rechnungsnummern verloren, die keinen Wert 1 in der Spalte d haben, das ist mein Problem.
      Code:
      Select rechnungsnr, sum(einzelpreis) from tabelle where d = 1 group by rechnungsnr

      Kommentar


      • #4
        Zitat von simond Beitrag anzeigen
        Bei folgender Abfrage gehen aber die Rechnungsnummern verloren, die keinen Wert 1 in der Spalte d haben, das ist mein Problem.
        Völlig korrekt, dafür hast du ja mit der Where-Klausel gesorgt. Wenn du das nicht willst, nimm halt die Where-Klausel weg. Ist das nicht eigentlich offensichtlich?
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          So erhalte ich aber nicht die gewünschte Lösung. Vielleicht habe ich mich unklar ausgedrückt. Es soll jede Rechnungsnr einmal ausgegeben werden. Dazu soll eine Spalte geben, die die Summe der Preise der einzelnen Rechnungsnr beinhaltet, die in der Spalte d den Wert 1 haben (siehe Muster Ergebnis).

          Kommentar


          • #6
            Google-Stichwort:

            MySQL Conditional SUM

            Hat genau 10 Sekunden gedauert. Versteh nicht warum du nicht erst googlest?
            This is what happens when an unstoppable force meets an immovable object.

            Kommentar


            • #7
              Wenn d nur 0 oder 1 sein kann, kannst du mit max(d) die Rechnungsnummern finden, die mindestens einmal mit d=1 auftauchen und die per HAVING auswählen:

              Code:
              SELECT
                  rechnungsnr,
                  sum(einzelpreis),
                  max(d) as flag
              FROM tabelle
              GROUP BY rechnungsnr
              HAVING flag = 1
              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
              Super, danke!
              [/COLOR]

              Kommentar


              • #8
                Zitat von AmicaNoctis Beitrag anzeigen
                Wenn d nur 0 oder 1 sein kann, kannst du mit max(d) die Rechnungsnummern finden, die mindestens einmal mit d=1 auftauchen und die per HAVING auswählen.
                Auch da fehlt Rechnungsnr. 101. Er will auf jeden Fall ALLE Rechnungsnr. haben - aber addiert werden soll nur dann, wenn d = 1 des einzelnen Eintrags ist. D.h. 101 muss auch im Ergebnis sein, und zwar mit 0.
                This is what happens when an unstoppable force meets an immovable object.

                Kommentar


                • #9
                  Achso, stimmt, dann eben
                  Code:
                  max(d) * sum(einzelpreis)
                  und ohne having.
                  [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                  Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                  Super, danke!
                  [/COLOR]

                  Kommentar


                  • #10
                    Stimmt auch nicht, das Ergebnis für 100 soll 15 sein und nicht 35. Du addierst die eine Spalte von 100, bei der d = 0 ist, immernoch mit. Kann ja garnicht funktionieren^^

                    Das geht echt nur mit Conditional SUM wies aussieht.
                    Zuletzt geändert von ApoY2k; 09.08.2011, 14:01.
                    This is what happens when an unstoppable force meets an immovable object.

                    Kommentar


                    • #11
                      Zitat von ApoY2k Beitrag anzeigen
                      Das geht echt nur mit Conditional SUM wies aussieht.
                      Das war der entscheidende Hinweis, vielen Dank! Hier die Lösung:
                      Code:
                      select rechnungsnr, sum(if (d =1,einzelpreis,0)) from tabelle group by rechnungsnr

                      Kommentar


                      • #12
                        Hätte nicht SUM(d * einzelpreis) auch funktioniert?

                        Kommentar

                        Lädt...
                        X