Gruppen Intervall Zeitauswertung
Gruppen Intervall Zeitauswertung
am 15.09.2006 09:57:22 von Frank Kirschner
Hallo zusammen,
Ich grübel über folgendes Problem und benötige bitte einen Denkanstoß:
Eine Tabelle enthält zwei Spalten:
geliefert => INT, Liefermenge
lieferzeit => INT, UNIX Timestamp
Es soll nun eine Statistik ausgegeben werden, wievie in jedem Monat
geliefert wurde. Das ist mein Ansatz:
SELECT SUM(geliefert) AS liefermenge, FROM_UNIXTIME(lieferzeit) AS zeit
FROM versand
GROUP BY MONTH(FROM_UNIXTIME(lieferzeit))
ORDER BY MONTH(FROM_UNIXTIME(lieferzeit))
Das Ergebis kann aber nicht stimmen, ich weiß nur nicht warum.
Hat vielleicht jemand eine Idee?
vlg
Frank
Re: Gruppen Intervall Zeitauswertung
am 15.09.2006 10:05:24 von Andreas Kretschmer
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
Re: Gruppen Intervall Zeitauswertung
am 15.09.2006 10:23:08 von Christian Kirsch
Am 15.09.2006 09:57 schrieb Frank Kirschner:
> Hallo zusammen,
>
> Ich grübel über folgendes Problem und benötige bitte einen Denkanstoß:
>
> Eine Tabelle enthält zwei Spalten:
>
> geliefert => INT, Liefermenge
> lieferzeit => INT, UNIX Timestamp
>
> Es soll nun eine Statistik ausgegeben werden, wievie in jedem Monat
> geliefert wurde. Das ist mein Ansatz:
>
> SELECT SUM(geliefert) AS liefermenge, FROM_UNIXTIME(lieferzeit) AS zeit
> FROM versand
> GROUP BY MONTH(FROM_UNIXTIME(lieferzeit))
> ORDER BY MONTH(FROM_UNIXTIME(lieferzeit))
>
> Das Ergebis kann aber nicht stimmen, ich weiß nur nicht warum.
>
> Hat vielleicht jemand eine Idee?
ist es nicht so, dass MONTH nur für DATE und DATETIME funktioniert?
Warum speicherst Du überhaupt einen Timestamp, wenn Du doch ein Datum
haben willst?
Re: Gruppen Intervall Zeitauswertung
am 15.09.2006 10:48:29 von Frank Kirschner
Christian Kirsch wrote on 15 Sep 2006:
> Am 15.09.2006 09:57 schrieb Frank Kirschner:
>> Hallo zusammen,
>>
>> Ich grübel über folgendes Problem und benötige bitte einen Denkanstoß:
>>
>> Eine Tabelle enthält zwei Spalten:
>>
>> geliefert => INT, Liefermenge
>> lieferzeit => INT, UNIX Timestamp
>>
>> Es soll nun eine Statistik ausgegeben werden, wievie in jedem Monat
>> geliefert wurde. Das ist mein Ansatz:
>>
>> SELECT SUM(geliefert) AS liefermenge, FROM_UNIXTIME(lieferzeit) AS zeit
>> FROM versand
>> GROUP BY MONTH(FROM_UNIXTIME(lieferzeit))
>> ORDER BY MONTH(FROM_UNIXTIME(lieferzeit))
>>
>> Das Ergebis kann aber nicht stimmen, ich weiß nur nicht warum.
>>
>> Hat vielleicht jemand eine Idee?
>
> ist es nicht so, dass MONTH nur für DATE und DATETIME funktioniert?
> Warum speicherst Du überhaupt einen Timestamp, wenn Du doch ein Datum
> haben willst?
Der Timestamp wird von einer Tracking Software erzeugt, den ich nicht
manipulieren oder formatieren kann.
Frank
Re: Gruppen Intervall Zeitauswertung
am 15.09.2006 10:58:09 von Christian Kirsch
Am 15.09.2006 10:48 schrieb Frank Kirschner:
> Christian Kirsch wrote on 15 Sep 2006:
>
>> Am 15.09.2006 09:57 schrieb Frank Kirschner:
>>> Hallo zusammen,
>>>
>>> Ich grübel über folgendes Problem und benötige bitte einen Denkanstoß:
>>>
>>> Eine Tabelle enthält zwei Spalten:
>>>
>>> geliefert => INT, Liefermenge
>>> lieferzeit => INT, UNIX Timestamp
>>>
>>> Es soll nun eine Statistik ausgegeben werden, wievie in jedem Monat
>>> geliefert wurde. Das ist mein Ansatz:
>>>
>>> SELECT SUM(geliefert) AS liefermenge, FROM_UNIXTIME(lieferzeit) AS zeit
>>> FROM versand
>>> GROUP BY MONTH(FROM_UNIXTIME(lieferzeit))
>>> ORDER BY MONTH(FROM_UNIXTIME(lieferzeit))
>>>
>>> Das Ergebis kann aber nicht stimmen, ich weiß nur nicht warum.
>>>
Wie sieht's denn aus, wenn Du auf die GROUP-Klausel verzichtest?
Re: Gruppen Intervall Zeitauswertung
am 15.09.2006 11:04:33 von Frank Kirschner
Andreas Kretschmer wrote on 15 Sep 2006:
> begin_ Frank Kirschner schrieb:
>> Hat vielleicht jemand eine Idee?
>
> Vielleicht so?
>
> test=*# select * from versand;
> datum | menge
> ------------------------+-------
> 2006-08-01 00:00:00+02 | 10
> 2006-08-10 00:00:00+02 | 10
> 2006-09-01 00:00:00+02 | 20
> 2006-09-11 00:00:00+02 | 20
> 2006-09-21 00:00:00+02 | 20
> (5 rows)
>
> test=*# select extract(month from datum), sum(menge) from versand
> group by extract(month from datum) order by 1;
> date_part | sum
> -----------+-----
> 8 | 20
> 9 | 60
> (2 rows)
>
> PostgreSQL, evtl. wirst Du für extract() was anderes nehmen müssen.
>
Jaaaa, extract() ist die Wunderwaffe die ich suchte. In MySQL ist es
genau
so. Jetzt passt es.
Vielen Dank.
Frank
Re: Gruppen Intervall Zeitauswertung
am 15.09.2006 11:08:35 von Frank Kirschner
Christian Kirsch wrote on 15 Sep 2006:
> Am 15.09.2006 10:48 schrieb Frank Kirschner:
>> Christian Kirsch wrote on 15 Sep 2006:
>>
>>> Am 15.09.2006 09:57 schrieb Frank Kirschner:
>>>> Hallo zusammen,
>>>>
>>>> Ich grübel über folgendes Problem und benötige bitte einen
>>>> Denkanstoß:
>>>>
>>>> Eine Tabelle enthält zwei Spalten:
>>>>
>>>> geliefert => INT, Liefermenge
>>>> lieferzeit => INT, UNIX Timestamp
>>>>
>>>> Es soll nun eine Statistik ausgegeben werden, wievie in jedem Monat
>>>> geliefert wurde. Das ist mein Ansatz:
>>>>
>>>> SELECT SUM(geliefert) AS liefermenge, FROM_UNIXTIME(lieferzeit) AS
>>>> zeit FROM versand
>>>> GROUP BY MONTH(FROM_UNIXTIME(lieferzeit))
>>>> ORDER BY MONTH(FROM_UNIXTIME(lieferzeit))
>>>>
>>>> Das Ergebis kann aber nicht stimmen, ich weiß nur nicht warum.
>>>>
>
> Wie sieht's denn aus, wenn Du auf die GROUP-Klausel verzichtest?
mit extract() funktioniert's :-)
Frank
Re: Gruppen Intervall Zeitauswertung
am 15.09.2006 11:14:51 von Christian Kirsch
Am 15.09.2006 11:08 schrieb Frank Kirschner:
> Christian Kirsch wrote on 15 Sep 2006:
>
>> Am 15.09.2006 10:48 schrieb Frank Kirschner:
>>> Christian Kirsch wrote on 15 Sep 2006:
>>>
>>>> Am 15.09.2006 09:57 schrieb Frank Kirschner:
>>>>> Hallo zusammen,
>>>>>
>>>>> Ich grübel über folgendes Problem und benötige bitte einen
>>>>> Denkanstoß:
>>>>>
>>>>> Eine Tabelle enthält zwei Spalten:
>>>>>
>>>>> geliefert => INT, Liefermenge
>>>>> lieferzeit => INT, UNIX Timestamp
>>>>>
>>>>> Es soll nun eine Statistik ausgegeben werden, wievie in jedem Monat
>>>>> geliefert wurde. Das ist mein Ansatz:
>>>>>
>>>>> SELECT SUM(geliefert) AS liefermenge, FROM_UNIXTIME(lieferzeit) AS
>>>>> zeit FROM versand
>>>>> GROUP BY MONTH(FROM_UNIXTIME(lieferzeit))
>>>>> ORDER BY MONTH(FROM_UNIXTIME(lieferzeit))
>>>>>
>>>>> Das Ergebis kann aber nicht stimmen, ich weiß nur nicht warum.
>>>>>
>> Wie sieht's denn aus, wenn Du auf die GROUP-Klausel verzichtest?
>
> mit extract() funktioniert's :-)
>
Das habe ich verstanden. Interessant wäre aber tatsächlich, was MONTH
bei Dir liefert - hier zumindest sehe ich exakt gar keinen Unterschied
zwischen beidem:
mysql> select month(from_unixtime(unix_timestamp(now())));
+---------------------------------------------+
| month(from_unixtime(unix_timestamp(now()))) |
+---------------------------------------------+
| 9 |
+---------------------------------------------+
1 row in set (0,00 sec)
mysql> select extract(month from from_unixtime(unix_timestamp(now())));
+----------------------------------------------------------+
| extract(month from from_unixtime(unix_timestamp(now()))) |
+----------------------------------------------------------+
| 9 |
+----------------------------------------------------------+
1 row in set (0,00 sec)
Re: Gruppen Intervall Zeitauswertung
am 15.09.2006 11:54:21 von Guido Schmidt
Christian Kirsch schrieb:
> Das habe ich verstanden. Interessant wäre aber tatsächlich, was MON=
TH
> bei Dir liefert - hier zumindest sehe ich exakt gar keinen Unterschied
> zwischen beidem:
Ich würde auch noch tippen, dass eine Gruppierung nach Monaten nicht da=
s=20
ist, was er eigentlich an Information aus der Datenbank bekommen möchte=
.
Ich vermute, dass er eigentlich eine Gruppierung nach Jahr und Monat=20
will. Spätestens wenn die Datenbank später Daten für mehrere Jahre =
enthält, wird er es merken.
Guido