WinFuture-Forum.de: MySQL-Abfrage mit unterschiedlichen Bedingungen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

MySQL-Abfrage mit unterschiedlichen Bedingungen Spalten summieren

#1 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.114
  • Beigetreten: 11. September 10
  • Reputation: 182

geschrieben 16. Januar 2015 - 15:17

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?
Ich bin ein sehr ordentlicher, fleißiger und reinlicher Mensch, nur leider gefangen im Körper eines schmuddeligen Faulpelzes … tja, kann man nix machen …
0

Anzeige

#2 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 7.507
  • Beigetreten: 20. Juli 07
  • Reputation: 832

geschrieben 16. Januar 2015 - 16:06

Du könntest einfach gruppieren:

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

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
0

#3 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.114
  • Beigetreten: 11. September 10
  • Reputation: 182

geschrieben 16. Januar 2015 - 16:46

Au das muß ich mir zu Hause angucken. Das sieht mir schon wieder so umständlich aus.
Ich bin ein sehr ordentlicher, fleißiger und reinlicher Mensch, nur leider gefangen im Körper eines schmuddeligen Faulpelzes … tja, kann man nix machen …
0

#4 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 7.507
  • Beigetreten: 20. Juli 07
  • Reputation: 832

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

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.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
0

#5 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.114
  • Beigetreten: 11. September 10
  • Reputation: 182

geschrieben 16. Januar 2015 - 19:42

Also genaugenommen ist die Tabelle so:


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

Ich bin ein sehr ordentlicher, fleißiger und reinlicher Mensch, nur leider gefangen im Körper eines schmuddeligen Faulpelzes … tja, kann man nix machen …
0

#6 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 7.507
  • Beigetreten: 20. Juli 07
  • Reputation: 832

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.

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

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
0

#7 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.114
  • Beigetreten: 11. September 10
  • Reputation: 182

geschrieben 16. Januar 2015 - 19:58

Ok na dann ist es kein Problem, dann mache ich 4 Abfragen, Danke.
Ich bin ein sehr ordentlicher, fleißiger und reinlicher Mensch, nur leider gefangen im Körper eines schmuddeligen Faulpelzes … tja, kann man nix machen …
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0