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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 302754
Url: https://administrator.de/contentid/302754
Ausgedruckt am: 21.11.2024 um 22:11 Uhr
13 Kommentare
Neuester Kommentar
Hi,
Beispiel
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
Beispiel
SELECT
FORMAT(Datum,'MM-yyyy') as MONAT,
sum(Stückzahl) as SUMME
FROM
DeineTabelle
GROUP BY MONAT
Demo in MySQL Style auch hier
http://sqlfiddle.com/#!9/851f29/2/0
Gruß jodel32
-edit- Code-Anpassung an MSSQL Style
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:
.. ungetestet.
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
}
}
}
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 ?
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 ?
Moin helmuthelmut2000,
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
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):
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
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.Hi jodel32,
Wie erstellt man denn eine temporäre Tabelle mit dem Bereich von Monaten und
Jahren? Wo ich dann meine Daten reinschreiben kann?
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
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
Moin helmuthelmut2000,
nach meinen rudimentären SQL-Kenntnissen sollte ein
... unter nun wirklich jedem handelsüblichen Datenbankblech neuer als Baujahr 1997 funktionieren.
Wenn das nicht tut, dann meinetwegen etwas wortreicher:
Sorry, sehe keinen Denkfehler im Statement oben.
Vielleicht kann jemand etwas dazu sagen, der MSSQL installiert hat.
Grüße und schönes Wochenende
Biber
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)
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