Statistik etwas kompliziert
am 14.09.2005 16:01:25 von roger.merz
Hallo NG
Ich möchte gerne eine Statistik der Verkäufe eines Onlineshops
ausgeben. Dazu möchte ich die Anzahl Verkäufe pro offer jedes Tages
ausgeben. Das geht so:
Struktur Table 'offer': id=A6offer=A6timestamp|etc.
SELECT count(id), offer, FROM_UNIXTIME(timestamp) FROM `orders`
WHERE timestamp > unix_timestamp(curdate()) GROUP BY offer
1)
Wie kann ich das nun umbasteln, dass es dies nicht nur vom aktuellen
Tag macht sondern für jeden Tag einzeln innerhalb der letzten x Tage?
2)
Etwas tricky wird es wohl da jede Bestellung einen Unixtimestamp hat.
Vielleicht wäre eine Lösung den Timestamp erstmal in YMD umzuwandeln
und dann irgendiwe mit einem zweiten GRUOP BY...? Vielleicht hat hier
jemand einen besseren Tipp.
Vielen Dank für jede Hilfe
Grüsse Roger Merz
Re: Statistik etwas kompliziert
am 14.09.2005 21:11:26 von Martin Kurz
roger.merz@gmail.com schrieb:
> Hallo NG
>
> Ich möchte gerne eine Statistik der Verkäufe eines Onlineshops
> ausgeben. Dazu möchte ich die Anzahl Verkäufe pro offer jedes Tages
> ausgeben. Das geht so:
>
> Struktur Table 'offer': id¦offer¦timestamp|etc.
>
> SELECT count(id), offer, FROM_UNIXTIME(timestamp) FROM `orders`
> WHERE timestamp > unix_timestamp(curdate()) GROUP BY offer
>
> 1.)
> Wie kann ich das nun umbasteln, dass es dies nicht nur vom aktuellen
> Tag macht sondern für jeden Tag einzeln innerhalb der letzten x Tage?
Kommt darauf an, wie Du den timestamp gespeichert hast...
> 2.)
> Etwas tricky wird es wohl da jede Bestellung einen Unixtimestamp hat.
> Vielleicht wäre eine Lösung den Timestamp erstmal in YMD umzuwandeln
> und dann irgendiwe mit einem zweiten GRUOP BY...? Vielleicht hat hier
> jemand einen besseren Tipp.
Ebenso.
Also erstmal die Frage: Ist die Spalte timestamp auch vom MySQL-Typ timestamp?
Oder hast Du den sonstwo generierten Timestamp in eine INT-Spalte eingefügt (ich
hoffe nicht)?
Zur Not sollte etwas in der Art gehen:
[...] WHERE FROM_UNIXTIME(timestamp, '%Y%m%d') = DATE_FORMAT(DATE_SUB(NOW(),
INTERVAL ANZAHL_DER_TAGE DAY), '%Y%m%d')
(hier wird der Timestamp in die Form YYYYMMDD umgewandelt und mit dem identisch
formatierten Ergebnis von "Heute - x Tage" verglichen)
Ansonsten sollte etwas in der Art zum Erfolg führen:
[...] WHERE DATE_ADD(timestamp, INTERVAL ANZAHL_DER_TAGE DAY) = CURDATE()
(zum timestamp werden x Tage hinzugezählt und geschaut, ob der aktuelle Tag
dabei rauskommt)
Eine letzte Möglichkeit wäre auch folgendes:
[...] WHERE timestamp < UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL
ANZAHL_DER_TAGE DAY)) AND timestamp > UNIX_TIMESTAMP(DATE_SUB(CURDATE(),
INTERVAL ANZAHL_DER_TAGE+1 DAY))
(und zu guter letzt wird hier einfach geschaut, ob die Zahl timestamp sowohl
kleiner ist, als der Timestamp, den man erhält, wenn man vom aktuellen Datum x
Tage abzieht, als auch größer als der timestamp, wenn man vom aktuellen Datum
x+1 Tage abzieht - ich glaube, bei Datum wird 00:00:00 Uhr genommen für den
Timestamp, da bin ich mir aber nicht 100% sicher, musst Du testen)
Infos zu den Funktionen findest Du unter
http://dev.mysql.com/doc/mysql/de/date-and-time-functions.ht ml
Und am einfachsten finde ich es, gleich eine DATETIME-Spalte zu nhemen :)
Und beim erneuten Lesen Deiner Frage, bin ich mir nicht mehr ganz so sicher, ob
Du für jeden Tag eine extra Abfrage machen willst... Wenn nicht, sollte das
Group by helfen:
SELECT count(id), offer, FROM_UNIXTIME(timestamp, '%Y%m%d') as orderdate FROM
`orders` GROUP BY offer, orderdate
(hier bin ich mir aber nicht mehr ganz sicher, ob man in MySQL das Ergebnis
einer Funktion überhaupt gruppieren kann??)
Grüße,
Martin