mixmastertobsi: einfach MySql abfrage

Hallo, ich versuche mich mal wieder an einer Datenbank-Abfrage. Leider klappt es bei mir nicht so, wie ich es mir vorstelle

Artikelnr | Artikel | Preis
----------------------------
1         | ArtikelX| 13
2         | ArtikelY| 18

Ich möchste nun, dass beide Artikel ausgegeben werden und gleichzeit noch die Summe beider Artikel erreichnet wird

Artikel | Preis | Gesamt
-------------------------
ArtikelX| 13    | 31
ArtikelY| 18    | 31

Wenn ich bei der Ausgabe die Spalte Preis summiere, wird nur noch eine Reihe ausgegeben. Wenn ich zusätzlich nach Artikelnr gruppiere, werden zwar beide Reihen ausgegeben, jedoch wird die Summe nicht korrekt ausgegeben.

SELECT artikel, preis, SUM(preis) FROM tabelle

SELECT artikel, preis, SUM(preis) FROM tabelle GROUP BY artikelnr

  1. Hi!

    Artikelnr | Artikel | Preis

    1         | ArtikelX| 13
    2         | ArtikelY| 18
    Ich möchste nun, dass beide Artikel ausgegeben werden und gleichzeit noch die Summe beider Artikel erreichnet wird
    Artikel | Preis | Gesamt

    ArtikelX| 13    | 31
    ArtikelY| 18    | 31

    Mitten in der Ausgabe und in jeder Zeile soll die Summe über alles stehen? Dann ermittle sie zuerst, leg das Ergebnis (noch in MySQL) in einer benutzerdefinierten Variable ab. Diese kannst du dann in die SELECT-Klausel der eigentlichen Abfrage einbinden.

    Wenn ich bei der Ausgabe die Spalte Preis summiere, wird nur noch eine Reihe ausgegeben.
    SELECT artikel, preis, SUM(preis) FROM tabelle

    Logisch, Aggregatfunktionen fassen die Ergebnismenge zu einer Zeile zusammen.

    Wenn ich zusätzlich nach Artikelnr gruppiere, werden zwar beide Reihen ausgegeben, jedoch wird die Summe nicht korrekt ausgegeben.
    SELECT artikel, preis, SUM(preis) FROM tabelle GROUP BY artikelnr

    Es wird dann pro Gruppe summiert. Wenn du noch ein Endergebnis als extra Zeile haben willst, dann gibt es da ein WITH ROLLUP (oder so ähnlich).

    Allerdings funktioniert dein Statement so nur in MySQL, denn wenn man gruppiert, ist nicht eindeutig zu bestimmen, welcher Wert für eine Spalte genommen werden soll, nach der nicht gruppiert wird, in deinem Fall der Preis. MySQL lässt das zwar zu, nimmt dann aber einen zufälligen Wert. Der ist nur dann der von dir gewünschte, wenn in deinen Daten pro Gruppe nur eindeutige Werte zu ermitteln sind.

    Lo!

    1. Hallo,

      vielen Dank für Deine Antwort.
      Kannst du mir bitte ein Beispiel machen.

      so etwa?

      SELECT artikel, preis, (SELECT SUM(preis) FROM tabelle) FROM tabelle GROUP BY artikelnr

      1. Hi!

        Kannst du mir bitte ein Beispiel machen.
        so etwa?
        SELECT artikel, preis, (SELECT SUM(preis) FROM tabelle) FROM tabelle GROUP BY artikelnr

        Das wäre nicht unbedingt sinnvoll, denn (ohne Optimierung) müsste die Summe mit jeder Zeile neu berechnet werden. Deswegen schlug ich ja eine benutzerdefinierte Variable vor.

        SELECT @sum:=SUM(preis) FROM tabelle
        SELECT artikel, preis, @sum summe FROM tabelle

        Eine Gruppierung brauchst du ja nun nicht mehr. Wenn du mit PHP arbeitest, sendest du das erste Statement normal mit mysql_query() ab. Ein Ergebnis musst du nicht Fetchen. (Das DBMS will das zwar, bevor eine weitere SELECT-Abfrage stattfinden kann, aber mysql_query() macht das bereits im Hintergrund in einen Zwischenpuffer.) Die zweite Abfrage erledigst du dann wie üblich.

        Lo!

        1. Nach deiner Lösung, muss ich jedoch zwei getrennte Abfragen erstellen. oder?!? Mit UNION geht es nicht

          1. Hi!

            Nach deiner Lösung, muss ich jedoch zwei getrennte Abfragen erstellen. oder?!? Mit UNION geht es nicht

            UNION an sich geht auch. Aber wenn es dir einfach nur an der Summe gelegen ist und nicht daran, dass sie in jedem Satz der Ergebnismenge auftaucht oder Dummyfelder wie bei UNION, mach einfach eine zweite Abfrage. Soviel kostet das nun auch wieder nicht, oder steht dein Datenbankserver am anderen Ende der Welt?

            Lo!