MySQL-Abfrage mit unterschiedlichen Bedingungen Spalten summieren
#1
geschrieben 16. Januar 2015 - 15:17
Spalte1: Datum
Spalte2: Schwarz
Spalte3: Cyan
Spalte4: Magenta
Spalte5: Yellow
Nun will ich mir eine Tintenstandsanzeige generierien. Beispielsweise kommt eine neue Patrone rein, am 1.1. 440ml Schwarz
Nun könnte einfach den Verbrauch ab dem 1.1. summieren und von 440 ml abziehen, ok kein Problem
SELECT SUM(schwarz)AS summe_schwarz FROM verbrauch WHERE datum >= 1.1. (ist in der Tabelle Timestamp)
Mein Problem ist dann aber das Summieren einer anderen Farbe, wenn die Patrone an einem anderen Tag gewechselt wurde. Das Ganze überhaupt hinzukriegen ist nun nicht so schlimm, ich könnte alle Verbrauche ab der ältesten Patrone abfragen und danauch sortieren und summieren oder ich mache 4 Abfragen aber vielleicht gibts ja die Möglichkeit, das in einer Abfrage zu machen oder wäre so eine Abfrage träger als 4 einzelne Abfragen?
Anzeige
#2
geschrieben 16. Januar 2015 - 16:06
SELECT timestamp.datum, SUM(...), ... FROM ... GROUP BY timestamp.datum ...;
Dann kriegst Du das nach Datum summiert. Kannst das auch in ein VIEW stecken und dann nur noch aus dem VIEW mit SELECT ... WHERE timestamp.datum = ... rausholen.
Wichtig: Wenn Du gruppierst, MUß die GROUP BY-Bedingung auch in der SELECT-Klausel auftauchen, und zwar in derselben Reihenfolge wie dort (falls mehrere).
Und bei MySQL extra wichtig: genau aufpassen, was man da tut. MySQL läßt auch blödsinnige SELECTs bei GROUP BY zu. Wenn Du gruppierst, darf die SELECT-Klausel nichts beinhalten, was durch das GROUP BY uneindeutig wird.
Wenn Du also sowas hast wie
COLOR CONTENTS 15 100 15 200 18 140
gibt's bei einem SELECT color, contents GROUP BY color Blödsinn. MySQL läßt das zu, fernab jedes Standards und jedes Verstandes.
-- MySQL Reference: SELECT syntax
Dieser Beitrag wurde von RalphS bearbeitet: 16. Januar 2015 - 16:13
#3
geschrieben 16. Januar 2015 - 16:46
#4
geschrieben 16. Januar 2015 - 17:12
Letztlich ist das einfach nur die vollständigere Form von Aggregatfunktionen wie SUM oder COUNT oder dergleichen. Beispiel COUNT: ohne GROUP BY zählt das alle Zeilen, die vom SELECT zurückgeliefert werden. Wenn Du aber GROUP BY anhängst, werden die Ergebnisse nach der GROUP BY-Bedingung aggregiert.
Am Ende kommt dann eine Ergebnistabelle raus wie zB
Datum | SUM(x) | 15/1/1 | 5 | 15/2/1 | 8 | ...
wenn die Ursprungstabelle sowas wie
Datum | x | 15/1/1 | 2 | 15/1/1 | 3 | 15/2/1 | 8 | ...
war.
Das macht also ganz genau das, was Du Dir vorgestellt hast.
#5
geschrieben 16. Januar 2015 - 19:42
datum | schwarz | cyan | magenta | yellow 1.1. | 1 | 2 | 1 | 4 2.1. | 4 | 3 | 2 | 2 3.1. | 3 | 3 | 2 | 3 4.1. | 1 | 2 | 4 | 1 5.1. | 3 | 1 | 3 | 2
Und die Abfrage soll heißen Summiere schwarz für alles was neuer ist als der 3.1, cyan für alles was neuer ist als der 1.1., magenta für alles neuere als 4.1. und yellow neuer als 5.1.
Ich werde es mal probieren.
Dieser Beitrag wurde von Holger_N bearbeitet: 16. Januar 2015 - 19:49
#6
geschrieben 16. Januar 2015 - 19:56
Lieber jeweils eine Abfrage bauen. Alles andere wäre unnötig kompliziert und hätte wahrscheinlich auch Einfluß auf die Abfragezeiten.
SELECT datum, SUM(schwarz) AS summe_schwarz FROM [tabelle] GROUP BY datum HAVING(datum > ?);
sollte das tun, hab's aber nicht nochmal abgetestet.
Dieser Beitrag wurde von RalphS bearbeitet: 16. Januar 2015 - 19:58
#7
geschrieben 16. Januar 2015 - 19:58
- ← WordPress to HTML
- Skript/Web-Programmierung
- Windows Powershell ParameterBindingValidationException →