Problem mit dem datum ausgeben

Liebe/-r Experte/-in,

ich habe folgendes Problem, und bin damit schon 2 Tage beschäftigt.

Die Daten befinden sich ganz unten, beschränkt auf das WIchtigste, query und nur notwendige Spalten.

Ich möchte die Gesammtsumme aufgelistet haben nach monat+jahr, damit ich mir ein schickes Diagramm machen kann, was ich so ausgebe an Technikkram.

In der DB sind mehrere Tage im Monat (typ date) die zusammenadiert werden müssen.

Theoretisch sieht das gut aus, aber irgendwie kommt es mir so vor, das

a) trotz angabe das sortiert werden soll nach MONAT sortiert wird.
Ich will aber es so haben, das nach neustem Monat im eingetragenen jahr
es angezeigt wird.

Ich könnte auch TIMESTAMP nehmen, sofern das viel besser ist.
Allerdings intressiert mich nur das datum.

b) es falsch berechnet wird.

Liegt es vielleicht daran das ich Dezimalzahlen nehme?
Anderes geht nicht da ich den genauen Preis eintragen will.

Vielen, vielen Dank im Vorraus!
Flo

SQL-DB:
CREATE TABLE IF NOT EXISTS gekaufteartikel (
id int(10) NOT NULL AUTO_INCREMENT,
favorit enum(‚0‘,‚1‘) CHARACTER SET latin1 NOT NULL DEFAULT ‚0‘,
kaufdatum date NOT NULL,
Produktname varchar(100) CHARACTER SET latin1 NOT NULL,
Preis decimal(6,2) NOT NULL,
URL_Geizhals varchar(100) CHARACTER SET latin1 NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=32 ;

PHP-Code:
$resultTABELLE = mysql_query(„SELECT MONTH(DATE(kaufdatum)) AS Monat, YEAR(kaufdatum) AS Jahr, SUM(Preis) AS SummePreis FROM $Tabellennamen GROUP BY MONTH(kaufdatum)“) OR DIE (mysql_error());

while($row2TABELLE = mysql_fetch_array($resultTABELLE))
{
echo "
>";
echo $row2TABELLE[‚Monat‘];
echo „/“;
echo $row2TABELLE[‚Jahr‘];

echo ": ";
echo $row2TABELLE[‚SummePreis‘];
echo " EUR
";

}

Liebe/-r Experte/-in,

ich habe folgendes Problem, und bin damit schon 2 Tage
beschäftigt.

Die Daten befinden sich ganz unten, beschränkt auf das
WIchtigste, query und nur notwendige Spalten.

Ich möchte die Gesammtsumme aufgelistet haben nach monat+jahr,
damit ich mir ein schickes Diagramm machen kann, was ich so
ausgebe an Technikkram.

Im GROUP BY fehlt „YEAR(‚kaufdatum‘)“, damit das passt, sonst addiert der ggfs. Monate von verschiedenen Jahren

In der DB sind mehrere Tage im Monat (typ date) die
zusammenadiert werden müssen.

Das passt schon so, das kann mysql ruhig machen.

a) trotz angabe das sortiert werden soll nach MONAT sortiert
wird.
Ich will aber es so haben, das nach neustem Monat im
eingetragenen jahr
es angezeigt wird.

ORDER BY kaufdatum desc
(zumindest wenn du keine zukünftigen Einträge in der DB hast)
Sollte das nicht gehen, dann halt
ORDER BY YEAR(kaufdatum) DESC, MONTH(kaufdatum) DESC

Ich könnte auch TIMESTAMP nehmen, sofern das viel besser ist.
Allerdings intressiert mich nur das datum.

Timestamp bringt keine Vorteile…

b) es falsch berechnet wird.

siehe oben :wink:

Liegt es vielleicht daran das ich Dezimalzahlen nehme?
Anderes geht nicht da ich den genauen Preis eintragen will.

DECIMAL ist da schon der passende Typ, das passt schon…

Zusammengefasst (nur SQL):

SELECT MONTH(kaufdatum)
AS Monat, YEAR(kaufdatum) AS Jahr, SUM(Preis) AS SummePreis FROM $Tabellennamen GROUP BY
MONTH(kaufdatum),YEAR(kaufdatum) ORDER BY kaufdatum DESC

hi,

nimm mal bei der group-klausel auch das jahr mit rein,
in dieser reihenfolge

GROUP BY MONTH, YEAR

dann sollte es eigentlich klappen.

cu
harald
********************

Hi Florifliegt1,

so auf den ersten Blick fällt mir zunächst mal auf, dass zu zwar nach Monat gruppierst, aber nicht zusätzlich nach Jahr. Demnach hast du - sofern die Tabelle einträgen von mehr als einem laufenden Kalenderjahr enthält - in der Summe immer z.B. alle Werte von allen Aprils aufsummiert.
Als zweites ist mir aufgefallen, dass du keineswegs eine Sortierung eingebaut hast, sondern nur eine Gruppierung.
Der korrekte Code für den Lese-Query sollte meiner Meinung nach wie folgt aussehen:

$resultTABELLE = mysql_query(„SELECT MONTH(DATE(kaufdatum)) AS Monat, YEAR(kaufdatum) AS Jahr, SUM(Preis) AS SummePreis FROM $Tabellennamen GROUP BY MONTH(kaufdatum), YEAR(kaufdatum) ORDER BY YEAR(kaufdatum) DESC, MONTH(kaufdatum) DESC“) OR DIE (mysql_error());

Wenn das noch nicht funktioniert (ich habs nicht getestet), kannst du dich gerne nochmal bei mir melden.

Grüße aus Köln,

Björn

aus eminer sicht solltest du nicht nur nach monat grupieren, denn nächstes jahr hat den selben monat und dann funktioniert die monatssumme nicht mehr

$resultTABELLE = mysql_query("SELECT MONTH(DATE(kaufdatum)) AS Monat, YEAR(kaufdatum) AS Jahr, SUM(Preis) AS SummePreis FROM $Tabellennamen
GROUP BY
YEAR(kaufdatum),
MONTH(kaufdatum)
ORDER BY
YEAR(kaufdatum),
MONTH(kaufdatum)
")
OR DIE (mysql_error());

so sollte es gehen, erst nach jahr gruppieren und dann nach monat
und ich würde das ganze sortieren

… mehr auf http://www.wer-weiss-was.de/app/query/display_query?..

Liebe/-r Experte/-in,

ich habe folgendes Problem, und bin damit schon 2 Tage
beschäftigt.

Die Daten befinden sich ganz unten, beschränkt auf das
WIchtigste, query und nur notwendige Spalten.

Ich möchte die Gesammtsumme aufgelistet haben nach monat+jahr,

Hallo, irgendwie ist mir nicht ganz klar, was Du willst.
Denke an John Dewey, der sagte:
„Ein Problem ist halb gelöst, wenn es klar formuliert ist.“

Kannst Du Deine Frage umformulieren? Danke!

Hallo Flori,
ob die von Dir gewählte Konstruktion grundsätzlich funktionieren könnte, weiß ich nicht, weil ich diese Syntax selbst so noch nie verwendet habe.
Was ich Dir also raten kann, ist, die Herangehensweise ein wenig zu ändern. Du magst dann entscheiden, ob Du mir darin folgst, oder ob Du Deinen Weg weiter zu optimieren versuchst.
Wenn ich Dich richtig verstanden habe, willst Du die Datenausgabe 1.) nach Monaten gruppieren und 2.) für jeden Monat die Summe der in diesem Monat getätigten Ausgaben anzeigen lassen. Beide Vorgänge überträgst Du an MySQL.
Es wird in Deiner Beschriebung nicht ganz klar, ob Du die Daten nach Monaten sortiert ausgeben, oder ob Du nur den aktuellen Monat ausgeben willst.
Wenn Du sortieren möchtest, fehlt die Sortierklausel „ORDER BY kaufdatum ASC“ (bzw. DESC, je nachdem, in welcher Reihenfolge Du sortieren willst).
Wenn Du nur den aktuellen Monat ausgeben willst, fehlt Where-Klausel „WHERE kaufdatum>=‚2012-10-01‘ AND kaufdatum“);
$monatssumme = 0;
}
/* die Summe des Monats wird zusammenaddiert */
$monatssumme+=$datensatz[Preis];
}
/* der letzte Monat wird auch noch ausgegeben */
echo($datensatz[Monat].".".$datensatz[Jahr].": ".$monatssumme."€
");
$altmonat = $datensatz[Monat];
?>

Ich hoffe, das hilft Dir weiter! Ich habe den Code nicht auf mögliche Tippfehler getestet.

Hallo,

ich hoffe ich bin nicht allzu spät mit der Antwort.

Zum einen ist die Sortierung sicher falsch, weil in der Query keine Sortierung angegeben wird. Da der Spaltentyp schon „date“ ist, kann einfach ein „order by kaufdatum asc“ angegeben werden, damit nach dem Kaufdatum sortiert wird.

Das die Preise falsch berechnet werden, kann ich mir nicht vorstellen. Der Datentyp decimal ist schon richtig, nur muss man beachten dass die Zeichenlänge von 6,2 bei diesem Typ bedeutet: 2 Nachkommastellten und vier Vorkommastellen (insgesamt 6 Stellen). Wenn also größere Einkäufe als 9999,99 getätigt werden, gibt es eine Verfälschung. Da ich keinen Einblick in die Daten habe, kann ich das leider nicht prüfen.

Viele Grüße

Alex

Hallo Björn,

genau das war es, das hat geklappt! Auf Anhieb.

Nun eine ähnliches Problem mit thema Gruppieren, denn da steige ich nicht durch:

Ich habe aktuell 3 queries, will die in einer fassen, das sollte ja mit GROUP BY gehen.

In der Datenbank gibt es al Angabe Plattform (ebay, Amazon, meinpaket)

Aktuell sieht es so aus:

$Datumsspalte = „kaufdatum“;
$resultPlattformMONATSAUSGABENAmazon = mysql_fetch_array(mysql_query(„SELECT SUM(Preis) FROM $Tabellennamen WHERE Plattform = ‚Amazon‘ GROUP BY Plattform“ )) OR DIE (mysql_error());

$resultPlattformMONATSAUSGABENebay = mysql_fetch_array(mysql_query(„SELECT SUM(Preis) FROM $Tabellennamen WHERE Plattform = ‚ebay‘ GROUP BY Plattform“ )) OR DIE (mysql_error());

$resultPlattformMONATSAUSGABENmeinpaket = mysql_fetch_array(mysql_query(„SELECT SUM(Preis) FROM $Tabellennamen WHERE Plattform = ‚meinpaket‘ GROUP BY Plattform“ )) OR DIE (mysql_error());

WIchtig hierbei, das ich jedes Ergebnis einzeln habe, da ich das in eine Tabelle einbaue, damit mir ein Diagramm angezeigt wird.

Achja, ich hoffe nicht das das verboten ist so gemixte Fragen zu stellen:

Wie kann ich in einer whiel-Schleife eine IF-Abfrage einbauen?
Ich habe ein Produktbild, und wenn keins da ist wird mit .jpg angezeigt was ja nicht geht.
Alternativ könnte ich die Dateien umbennen in Produkt1bild.jpg
und ohne Ausgabe von Produkt1 wird bild.jpg angezeigt was ein dummy-Bild ist.

Aber das ist alles total umständlich.

Danke
Flo

Es hat sich schon gelöst.

„Ein Problem ist halb gelöst, wenn es klar formuliert ist.“

Das problem habe ich häufig, wenn etwas kompliziert ist zu erklären. Ich versuche mich zu bessern. Bis zum nächsten Problem. :smile:

Gruß
Flo

Hi Flo,

Antworten inline:

Hallo Björn,

genau das war es, das hat geklappt! Auf Anhieb.

Prima!

Nun eine ähnliches Problem mit thema Gruppieren, denn da
steige ich nicht durch:

Ich habe aktuell 3 queries, will die in einer fassen, das
sollte ja mit GROUP BY gehen.

In der Datenbank gibt es al Angabe Plattform (ebay, Amazon,
meinpaket)

Aktuell sieht es so aus:

$Datumsspalte = „kaufdatum“;
$resultPlattformMONATSAUSGABENAmazon =
mysql_fetch_array(mysql_query(„SELECT SUM(Preis) FROM
$Tabellennamen WHERE Plattform = ‚Amazon‘ GROUP BY
Plattform“ )) OR DIE (mysql_error());

$resultPlattformMONATSAUSGABENebay =
mysql_fetch_array(mysql_query(„SELECT SUM(Preis) FROM
$Tabellennamen WHERE Plattform = ‚ebay‘ GROUP BY Plattform“
)) OR DIE (mysql_error());

$resultPlattformMONATSAUSGABENmeinpaket =
mysql_fetch_array(mysql_query(„SELECT SUM(Preis) FROM
$Tabellennamen WHERE Plattform = ‚meinpaket‘ GROUP BY
Plattform“ )) OR DIE (mysql_error());

WIchtig hierbei, das ich jedes Ergebnis einzeln habe, da ich
das in eine Tabelle einbaue, damit mir ein Diagramm angezeigt
wird.

Ich würde das ganze so machen:

$resultPlattformMONATSAUSGABENalle =
mysql_fetch_array(mysql_query(„SELECT Plattform, SUM(Preis) FROM
$Tabellennamen GROUP BY
Plattform“ )) OR DIE (mysql_error());

Nun hast du in $resultPlattformMONATSAUSGABENalle drei Zeilen, für jede Plattform eine. Die kannst du ganz einfach mit foreach oder so durchlaufen.

Achja, ich hoffe nicht das das verboten ist so gemixte Fragen
zu stellen:

Wie kann ich in einer whiel-Schleife eine IF-Abfrage einbauen?
Ich habe ein Produktbild, und wenn keins da ist wird mit .jpg
angezeigt was ja nicht geht.
Alternativ könnte ich die Dateien umbennen in Produkt1bild.jpg
und ohne Ausgabe von Produkt1 wird bild.jpg angezeigt was ein
dummy-Bild ist.

Auch hier würde ich nicht mit while sondern mit foreach arbeiten. Nehmen wir an, deine Produkte stehen in $produkte als Array und in jedem Array gibt es dann das Bild unter $produkte[0][‚image‘]. Dann würde das ganze so aussehen:

foreach($produkte as $produkt_key => $produkt)
{
if(empty($produkt[‚image‘]) {
$produkt[‚image‘] = „dummy.jpg“;
}
}

Wenn du bei deiner While-Schleife bleiben willst, kannst du den Block mit der if-Schleife aber auch einfach in die While-Schleife reinpacken.
Grundsätzlich gilt in PHP, dass man zusammenhängende Code-Blöcke beliebig ineinander verschachteln kann. Ein Code-Block ist dabei entweder eine Zeile oder eine Gruppe von Zeilen, die mit {} zusammengefasst wurde.

Aber das ist alles total umständlich.

Danke
Flo

Auch hier natürlich wieder: Bei Rückfragen einfach melden.

Gruß, Björn

Hallo Björn,

Egal ob ich es mit
$resultPlattformMONATSAUSGABENalle[ebay]
ausgeben will, noch mit
$resultPlattformMONATSAUSGABENalle[0]

Aber $resultPlattformMONATSAUSGABENalle[1] klappt, die Summe ist aber mit einer errechnet nicht identisch.

Ich will die nicht in eine Schleife packen, da mir das zu aufwendig ist.
Das Diagramm geht ja auch so.

Wie gebe ich eigendlich das erste Datum aus, oder das letzte Datum?

(von den eingetragenen Einträgen, vom Spaltenname kaufdatum? (typ date)

Das mit dem foreach rumspielen und irgendwann meine whiel ersetzen mache ich später. Aktuell habe ich (in meinen 3 Wochen „Urlaub“) 4 kleine Tools (gekaufte artikel, ebayverwaltung, Seriennummern und FIlmbewertungen, mit auflisten/bearbeiten/löschen/statistik usw.) die funktionieren alle sher ähnlich, sollen nur meine doofen Exceltabellen ersetzen. (nach einem Jahr habe ich mich da mal drangemacht, stand so lange auf meiner todoliste)

Gruß
Flo

Hi Flo,

ok, das ganze wird dann hier doch etwas zu umfangreich, um es in diesen komischen www-Nachrichten zu klären. Kontkatier mich am besten einfach mal per Skype, dann schauen wir mal gemeinsam auf deinen Code. Da finden wir sicher schnell nen vernünftigen Weg. Mein Skype-Username ist „splattermania“.

Gruß, Björn

Hi Flo,

dein GROUP BY ist fehlerhaft, denn du hast 2 determinierende Spalten (Jahr und Monat), aber du gruppierst nur nach Monat. Das Aggregat SUM wird daher alle Januare, Februare etc. zusammenfassen.

Außerdem ist das hier:
MONTH(DATE(kaufdatum))
mindestens überflüssig, wenn nicht gar falsch.
MONTH(kaufdatum) sollte ausreichen.

Ein GROUP BY kann man wie ORDER BY mit den Modifikatoren DESC oder ASC versehen. Außerdem kannst und solltest du den Alias-Namen verwenden, den du im SELECT definiert hast, das vermeidet einen überflüssigen Funktionsaufruf.

Try this:
SELECT …
FROM …
GROUP BY Jahr DESC, Monat DESC

Gruß
Thomas