Newsgroup: it.comp.www.php
Titolo: Calcolare la media raggruppando per anno, bimestre, trimestre e semestre

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!

 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.

 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 :|
 

 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.
 

 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ò :)


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.
 
 

 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.
 

 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

 ammesso che si possa risolvere tutto con una select
 
Sì, si può, fidati. "Ora và e studia" [cit.]
 
	Y.