Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Calcolare la media raggruppando per anno, bimestre, trimestre e semestre

463 views
Skip to first unread message

Pecas

unread,
Mar 30, 2012, 4:41:19 AM3/30/12
to
Salve a tutti,

Come da oggetto devo creare una pagina che raggruppi l'andamento medio
di un campo su una tabella raggruppandoli per anno, bimestre, trimestre
e semestre a seconda della scelta di un utente.

Per quanto riguarda PHP penso che potrei fare un ciclo FOR da 0 a
datadiff che passa tra le 2 date che l'utente mi passa. Nell'array
risultante formato da un array es:

$date[] = array('anno' => $year, 'mese_inizio' => $mese_inizio,
'mese_fine' => $mese_fine);

$mese_fine è uguale a $mese_inizio + $mesi di raggruppamento (es
trimestre è uguale a 3)

alla fine avrei un array con gli anni e i mesi da cercare. Poi passo ad
sql facendo una ricerca del tipo:

select avg(campo) as avg from tabella where datefield between
$date[$i]['anno'].'-'.$date[$i]['mese_inizio'] to
$date[$i]['anno'].'-'.$date[$i]['mese_fine'] group by date_part('year',
datefield),date_part('month', datefield);

Sono andato un pò a memoria ma il senso pensate che funzioni oppure
avete idee migliori?

Grazie!

yossarian

unread,
Mar 30, 2012, 5:07:11 AM3/30/12
to
Pecas wrote:

> Come da oggetto devo creare una pagina che raggruppi l'andamento medio
> di un campo su una tabella raggruppandoli per anno, bimestre, trimestre
> e semestre a seconda della scelta di un utente.
[...]
> Per quanto riguarda PHP penso che potrei fare un ciclo FOR
> Sono andato un pò a memoria ma il senso pensate che funzioni oppure
> avete idee migliori?

Sì. Studiati il linguaggio SQL e non fare fare a PHP quello che puoi
fare in maniera più semplice ed efficente in SQL.

Y.

Pecas

unread,
Mar 30, 2012, 7:10:38 AM3/30/12
to
> Sì. Studiati il linguaggio SQL e non fare fare a PHP quello che puoi
> fare in maniera più semplice ed efficente in SQL.

per farlo con SQL dovrei creare una funzione o una procedura però visto
che sono diversi cicli di istruzioni :|

yossarian

unread,
Mar 30, 2012, 7:40:46 AM3/30/12
to
Pecas wrote:

> per farlo con SQL dovrei creare una funzione o una procedura però visto
> che sono diversi cicli di istruzioni :|

Eh? E perchè?

Esempio di raggruppamento per anno:

select year(data_inizio),sum(numero_iscritti) from eventi group by
year(data_inizio);

Esempio di raggruppamento per trimestre:

select year(data_inizio),quarter(data_inizio),sum(numero_iscritti) from
eventi group by year(data_inizio),quarter(data_inizio);

Per bimestre e semestre non c'è la funzione precotta, basta usare la
funzione month() e lo statement case ... when ... e fai tutti i
raggruppamenti che vuoi.

Y.

Pecas

unread,
Mar 30, 2012, 7:56:09 AM3/30/12
to
> Per bimestre e semestre non c'è la funzione precotta, basta usare la
> funzione month() e lo statement case ... when ... e fai tutti i
> raggruppamenti che vuoi.

Porca miseria sarà che proprio non entro nella logica ma mica ho
capito... Il problema è che se ho le date tipo:

$start = '2011/01/01'
$stop = '2012/03/30'

Quindi con anno diverso e i mesi contigui non capisco che select dovrei
fare per farmi tornare i raggruppamenti che mi indichi tu.

Scusami se sembro insistente però :)

RedWiz

unread,
Mar 30, 2012, 3:26:07 PM3/30/12
to
Quindi non hai delle date, ma dei varchar dove metti dentro delle date
italiane.

butta via tutto e trasforma i campi varchar in campi date(time) , lo fai
facilemnte con uno script di poche righe, così puoi applicare le
comodissime funzioni che mysql ti mette a disposizione.


Pecas

unread,
Mar 31, 2012, 12:06:48 PM3/31/12
to
> Quindi non hai delle date, ma dei varchar dove metti dentro delle date
> italiane.
>
> butta via tutto e trasforma i campi varchar in campi date(time) , lo fai
> facilemnte con uno script di poche righe, così puoi applicare le
> comodissime funzioni che mysql ti mette a disposizione.

No spe... era per far capire il formato.
Le date provengono da dei campi text di un form che l'utente invia. Poi
sul DB(Postgresql 9.1) i campi sono dei timestamp completi di data e ora
ma a me interessa solo la data in questo caso.

Per le funzioni potresti essere più chiaro? Uso un db differente ma la
logica dovrebbe essere la stessa. Per la generazione delle select,
ammesso che si possa risolvere tutto con una select che non ho trovato,
posso anche studiare una buona combinazione tra php e sql. Con PHP
splitto il range di date in anni/mesi e poi faccio una select della
media con il parametro between data_start and data_stop.

Innuendo

unread,
Apr 1, 2012, 11:49:28 AM4/1/12
to
Il 31/03/2012 18.06, Pecas ha scritto:
> Per le funzioni potresti essere più chiaro? Uso un db differente ma la
> logica dovrebbe essere la stessa. Per la generazione delle select,
> ammesso che si possa risolvere tutto con una select che non ho trovato,
> posso anche studiare una buona combinazione tra php e sql. Con PHP
> splitto il range di date in anni/mesi e poi faccio una select della
> media con il parametro between data_start and data_stop.

Ma hai almeno provato a scrivere le query che ti ha indicato yossarian?

ciao
Mauro
Message has been deleted

yossarian

unread,
Apr 2, 2012, 5:43:32 AM4/2/12
to
Pecas wrote:

> Le date provengono da dei campi text di un form che l'utente invia. Poi
> sul DB(Postgresql 9.1) i campi sono dei timestamp completi di data e ora
> ma a me interessa solo la data in questo caso.

Magari se dicevi subito quel'era il DB ti facevo degli esempi
appropriati. Di solito quando non viene specificato il DB si considera
MySQL (di solito perchè che gli utenti MySQL non sanno che esistono
altri DB o pensano che siano tutti uguali... piccola polemica...)

Se usi PostgreSQL, EXTRACT is your friend, accoppiato allo statement
CASE...WHEN...END come ti ho spiegato nel post precedente:

http://www.postgresql.org/docs/9.1/static/functions-datetime.html

> ammesso che si possa risolvere tutto con una select

Sì, si può, fidati. "Ora và e studia" [cit.]

Y.
0 new messages