einfach MySql abfrage
mixmastertobsi
- datenbank
0 dedlfix
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
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 | GesamtArtikelX| 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!
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
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!
Nach deiner Lösung, muss ich jedoch zwei getrennte Abfragen erstellen. oder?!? Mit UNION geht es nicht
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!