helmuthelmut2000
Goto Top

Werte in einer sql Spalte addieren

Hallo,

Ich habe folgendes Problem.
Ich habe eine PHP Seite mit einer MSSQL Datenbank.

Da gibt es eine Tabelle mit den Spalten:

Stückzahl und Datum.
Jetzt möchte ich die Stückzahlen zusammen addiert ausgeben nach Monaten.

Es sollten nachher Spalten sein mit Stückzahl Jan. Feb. usw.

Kann man das machen?

Gruß
Helmut

Content-Key: 302754

Url: https://administrator.de/contentid/302754

Printed on: April 16, 2024 at 13:04 o'clock

Mitglied: 114757
Solution 114757 Apr 24, 2016 updated at 09:49:34 (UTC)
Goto Top
Hi,
Beispiel
SELECT
  FORMAT(Datum,'MM-yyyy') as MONAT,  
  sum(Stückzahl) as SUMME
FROM
  DeineTabelle
GROUP BY MONAT
Spaltennamen und Tabellennamen sind selbstverständlich anzupassen.
Demo in MySQL Style auch hier
http://sqlfiddle.com/#!9/851f29/2/0

Gruß jodel32

-edit- Code-Anpassung an MSSQL Style
Member: helmuthelmut2000
helmuthelmut2000 Apr 24, 2016 at 10:06:01 (UTC)
Goto Top
Hallo,

Danke. Das passt.

Gruß
Helmut
Member: helmuthelmut2000
helmuthelmut2000 Apr 24, 2016 at 18:39:29 (UTC)
Goto Top
Hallo,

Die Frage ist schon gelöst, und es funktioniert auch gut.
Aber wie kann ich das machen, damit ich an einem Monat wo
keine Zahl steht eine 0 ausgegeben wird.
Dann ist das ganze Übersichtlicher wenn die Tabelle Rückwärts das ausgibt.

z.B.

summe Monat Jahr
100 4 2016
0 3 2016
320 2 2016

usw.

Danke.
Member: nxclass
nxclass Apr 25, 2016 at 08:08:49 (UTC)
Goto Top
Die DB kann dir nur Werte zurückliefern welche auch gespeichert wurden. Man könnte hier tricksen (temp. Tabellen mit Monaten und Jahren und dann JOIN), das macht aber keinen Sinn.
Löse das in PHP, zB:

$data = array();
// Daten aufbereiten
foreach ($dbResult as $row) {
  $data[ $data['year'] ][ $data['month'] ] = $data['sum'];  
}

// Ausgabe aller Monate/Jahre
for ($year = min(array_keys( $data)); $year<= max(array_keys( $data)); $year++) {
  for ($month = 1; $month <= 12; $month) {

  if (isset( $data[$year][$month] ) {
    // Ausgabe mit Wert
  } else {
    // Ausgabe ohne Wert
  }

  }
}
.. ungetestet.
Member: helmuthelmut2000
helmuthelmut2000 Apr 25, 2016 at 15:02:33 (UTC)
Goto Top
Hallo nxclass,

Ja wie funktioniert das mit dem Array?
Kann ich nicht mit einem Befehl das jüngste und das älteste Monat und Jahr bekommen und
dann in einer temp Tabelle die lesen und dann 1-12 dazu machen. Dann die Daten in die Tabelle
schreiben und dann select machen auf die temp Tabelle. Dann sollten doch die fehlenden auch mit 0 kommen.

Gruß
Mitglied: 114757
114757 Apr 25, 2016 updated at 15:12:07 (UTC)
Goto Top
Ich würde eher zu sowas tendieren wenn bestimmte Monate in deinen Listen fehlen
http://stackoverflow.com/questions/11479918/include-missing-months-in-g ...
Oder einer temporären Tabelle mit den Monaten:
http://stackoverflow.com/questions/6125504/how-can-i-generate-a-tempora ...

Oder sind alle Monate vorhanden und du brauchst die nur nachträglich auf 0 ?
Member: helmuthelmut2000
helmuthelmut2000 Apr 26, 2016 at 05:39:23 (UTC)
Goto Top
Hi jodel32,

Nein es sind nicht alle Monate vorhanden. Das ist mein Problem.
Ich habe einen Zeitraum von Monaten. z.B. von 1.2010 bis 4.2016
Und dazwischen fehlen einige Monate. Jetzt ist das sehr unübersichtlich
wenn die fehlende Monate nicht mit 0 kommen.

Wie erstellt man denn eine temporäre Tabelle mit dem Bereich von Monaten und
Jahren? Wo ich dann meine Daten reinschreiben kann?

Gruß
Member: Biber
Biber Apr 26, 2016 updated at 07:41:45 (UTC)
Goto Top
Moin helmuthelmut2000,


Zitat von @helmuthelmut2000:

Hi jodel32,

Wie erstellt man denn eine temporäre Tabelle mit dem Bereich von Monaten und
Jahren? Wo ich dann meine Daten reinschreiben kann?
Hmm, jobel32 hat doch zwei Links gepostet.
Um was ging es da gleich noch?
Wie backe ich Baumkuchen? Wieso Elvis keine Flatrate braucht? Warum Winterkorn keinen Diesel mehr fahren will?

Schau doch auch noch mal rein...

Aber zu deinem Problemchen:
Von der Mimik her brauchst du sinnvollerweise eine "Zeitdimensionstabelle" wie oben skizziert.
Aber du brauchst eigentlich keine temporäre Tabelle, sondern eine stinknormale 08/15-Tabelle (also eine persistierte).
Denn du brauchst sie erstens vermutlich dauerhaft (für dieses Jahr, nächstes Jahr auch, übernächstes ebenso...) und du brauchst zweitens keine Monstertabelle mit Tagesgranularität für den Zeitraum vom 1.1.1900 bis 31.12.2999, sondern nur eine Handvoll Datensätze.
Kannst du nebenbei beim Telefonieren zusammenschroten.

Beispiel: Eine Tabelle JahrMonat mit zwei numerischen Spalten JAHR und MONAT, die auch den PK der Tabelle bilden.
Die kannst du füllen mit den Werten
JAHR MONAT
2016  1
2016  2
2016  3
...
2016  12
2017  1
..
2018 12
Wenn du diese Tabelle als die "führende Tabelle" in einem LEFT JOIN nimmst, dann hast du alle Monats-Zeilen und kannst den reporteten Zeitraum nach Belieben einschränken.

Beispiel (natürlich ungetestet):
SELECT jm.jahr, jm.monat, coalesce(d.Stückzahl, 0) as Stückzahl
FROM Jahrmonat jm left join
( Select Year(datum) as Jahr,   Month(datum) as Monat,  sum(Stückzahl) as Stückzahl
  From DeineTabelle d
 Group by  Year(datum) ,   Month(datum)  
) d on jm.jahr = d.jahr and jm.monat=d.monat
WHERE jm.Monat = 2016  AND jm.Monat BETWEEN 1 and 5

Die letzte Zeile, die WHERE-Bedingung kannst und musst du natürlich variieren.
Oder du kannst die WHERE-Bedingung weglassen, das Statement als VIEW speichern und diesen VIEW fallweise mit einer passenden WHERE-Clause aufrufen.

Grüße
Biber
Member: helmuthelmut2000
helmuthelmut2000 Apr 28, 2016 at 21:24:11 (UTC)
Goto Top
Hallo Biber,

Ich hab das versucht mit deinem Code aber das geht bei mir nicht,
Ich bekomme da immer die Fehlermeldung das ich Year in Group by liste
eintagen soll.Woran kann das noch liegen?

Danke.
Member: Biber
Biber Apr 29, 2016 at 13:52:29 (UTC)
Goto Top
Moin helmuthelmut2000,

nach meinen rudimentären SQL-Kenntnissen sollte ein
SELECT Year(datum) as Jahr,   Month(datum) as Monat,  sum(Stückzahl) as Stückzahl 
FROM DeineTabelle 
 GROUP BY  Year(datum) ,   Month(datum)  
... unter nun wirklich jedem handelsüblichen Datenbankblech neuer als Baujahr 1997 funktionieren.

Wenn das nicht tut, dann meinetwegen etwas wortreicher:
SELECT Jahr, Monat, Sum(Stückzahl) as Stückzahl from (
SELECT Year(datum) as Jahr,   Month(datum) as Monat,  Stückzahl 
FROM DeineTabelle 
) x
GROUP BY Jahr, Monat

Sorry, sehe keinen Denkfehler im Statement oben.
Vielleicht kann jemand etwas dazu sagen, der MSSQL installiert hat.

Grüße und schönes Wochenende
Biber
Member: helmuthelmut2000
helmuthelmut2000 May 01, 2016 at 10:11:04 (UTC)
Goto Top
Hallo Biber,

Kannst du mir da noch mal weiterhelfen,

Ich habe da einen select von einer Tabelle wo ich folgende werte bekomme.

Jahr Monat summe
2015 1 200
2015 3 400


Jetzt mochte ich in einer neuen Tabelle die ich schon erstellt habe, die heist JahrMonat

die Zeile:
2015 2 0

einfügen.

Wie macht man das?
Mit einem update von dem select von einer anderen Tabelle.

Gruß
Member: helmuthelmut2000
helmuthelmut2000 May 01, 2016 at 15:11:51 (UTC)
Goto Top
Hallo Biber,

Ich hab das hin bekommen.
Bräuchte aber noch deine Hilfe.
Jetzt steht mir das ganze in einer Tabelle von
2014 1 0
2014 2 0
.
2015 1 200
2015 2 0
2015 3 400
2016 4 0
usw.

Jetzt möchte ich aber nur den Bereich vom ersten wo in Stückzahl etwas steht
bis zum letzten ausgeben.

Gruß
Member: helmuthelmut2000
helmuthelmut2000 May 01, 2016 at 21:12:17 (UTC)
Goto Top
Hallo Biber,

Ich hab es hin bekommen.

Gruß
Helmut