Moin, ich habe da mal wieder ein kleines Problem. Kann man Spaltensummen mit unterschiedlichen Bedingungen bilden? Ich mache mal ein Beispiel. Ich habe eine Tabelle, wo jeder Druckvorgang eines Druckers registriert wird inklusive des Tintenverbrauchs für jede Patrone.
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?
Seite 1 von 1
MySQL-Abfrage mit unterschiedlichen Bedingungen Spalten summieren
#1
geschrieben 16. Januar 2015 - 15:17
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
Anzeige
#2
geschrieben 16. Januar 2015 - 16:06
Du könntest einfach gruppieren:
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
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
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
Au das muß ich mir zu Hause angucken. Das sieht mir schon wieder so umständlich aus.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
#4
geschrieben 16. Januar 2015 - 17:12
Nee, nicht wirklich. Du hängst einfach ein GROUP BY an die SELECT-Klausel dran und verwendest (falls nötig) für Einschränkungen der GROUP BY-Bedingung nicht WHERE, sondern HAVING.
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
wenn die Ursprungstabelle sowas wie
war.
Das macht also ganz genau das, was Du Dir vorgestellt hast.
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
Also genaugenommen ist die Tabelle so:
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.
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
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
#6
geschrieben 16. Januar 2015 - 19:56
Da bringt eine Abfrage für alles zusammen nicht viel.
Lieber jeweils eine Abfrage bauen. Alles andere wäre unnötig kompliziert und hätte wahrscheinlich auch Einfluß auf die Abfragezeiten.
sollte das tun, hab's aber nicht nochmal abgetestet.
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
Ok na dann ist es kein Problem, dann mache ich 4 Abfragen, Danke.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
- ← WordPress to HTML
- Skript/Web-Programmierung
- Windows Powershell ParameterBindingValidationException →
Thema verteilen:
Seite 1 von 1