selezionare valori per singolo mese e sommarli

Ciao

La discussione sulla libreria libchart mi ha riportato alla mente un vecchio problema che non sono riuscito a risolvere.

Avendo nel db record che rappresentano documenti con data e importo io vorrei fare in modo che per ogni mese siano sommati gli importi dei documenti relativi ai propri mesi di appartenenza in modo poi da produrre un singolo grafico per ogni mese.

Faccio un esempio.

Se nel modulo di ricerca inserisco 2 date ad esempio 12/01/2011 e 17/03/2011

vorrei che venissero sommati tutti gli importi dei documenti di

gennaio dal 12 ovviamente

tutto febbraio

e di marzo fino al 17

per poi produrre 3 grafici (uno dopo l'altro o magari nella stessa tabella se la libreria lo permette)

separati

Io per il momento sono riuscito solo ad inviare allo script che produce il grafico (non libchart) tutti i valori dal 12/01 al 17/03 producendo un unico (grande e pesante) grafico.

Qualcuno potrebbe aiutarmi a capire come risolvere la questione?

Grazie

inviato 5 anni fa
frankphp
X 0 X

puoi riportare sommariamente la struttura della tabella che contiene i documenti?

 :bye:

risposto 5 anni fa
Gianni Tomasicchio
X 0 X

puoi riportare sommariamente la struttura della tabella che contiene i documenti?

 :bye:

beh niente di eccezionale.

Veramente ne sono 2 (una di un vecchio progetto dove mi sono bloccato proprio in questo punto e una nuova molto simile).

una cosa del genere:

`id_fattura` int(5) NOT NULL auto_increment,

  `numero_fatt` int(5) NOT NULL default '0',

  `id_cliente` int(5) NOT NULL default '0',

  `totale` float NOT NULL default '0',

  `annotazioni` text collate latin1_general_ci NOT NULL,

  `giorno` date NOT NULL

Giorno è la data del documento

oppure:

`id` int(5) unsigned NOT NULL auto_increment,

  `doc` varchar(32) collate latin1_general_ci NOT NULL default '',

  `datain` date NOT NULL,

  `descrizione` tinytext collate latin1_general_ci NOT NULL,

  `fornitore` int(11) NOT NULL,

  `importo` decimal(10,2) NOT NULL default '0.00',

  `note` tinytext collate latin1_general_ci NOT NULL,

  `stato` smallint(6) NOT NULL default '0'

ecc ecc

Grazie

risposto 5 anni fa
frankphp
X 0 X

potresti effettuare una query del genere:

SELECT SUM(importo) somma, DATE_FORMAT(datain,'%m/%Y') mese FROM fatture GROUP BY mese

 :bye:

risposto 5 anni fa
Gianni Tomasicchio
X 0 X

potresti effettuare una query del genere:

SELECT SUM(importo) somma, DATE_FORMAT(datain,'%m/%Y') mese FROM fatture GROUP BY mese

 :bye:

ok. Non sono tanto bravo con le query mysql.

Come riporto poi i dati ottenuti in un grafico di questo tipo:

http://naku.dohcrew.com/libchart/pages/introduction/sample1.html

Mi interesserebbe però (era questo il progetto originale) oltre a sommarli stampare il valore nel grafico giorno per giorno (quando presente l'importo del documento per quel giorno) e dividere il grafico per mese.

Quindi una grafico per gennaio (con gli importi e la somma relativi solo all'intervallo selezionato del mese) una per febbraio e un altro per marzo (fino al giorno selezionato).

E' possibile? Lo so che è più difficile.

In ogni caso una cosa alla volta  :).

Prima stampiamo le somme per mese...poi vediamo.

Grazie

risposto 5 anni fa
frankphp
X 0 X

Hai provato ad eseguire la query? Ti restituisce delle coppie di valori mese => somma degli importi,  da utilizzare nelle istruzioni:

$dataSet->addPoint(new Point("Jan 2005", 273));

 :bye:

risposto 5 anni fa
Gianni Tomasicchio
X 0 X

Hai provato ad eseguire la query? Ti restituisce delle coppie di valori mese => somma degli importi,  da utilizzare nelle istruzioni:

$dataSet->addPoint(new Point("Jan 2005", 273));

 :bye:

Ho fatto così:

include ("config.php");

$querystat = "SELECT SUM(importo) somma, DATE_FORMAT(datain,'%m/%Y') mese FROM scadenze GROUP BY mese";

$risultato = mysql_query($querystat);

while ($record = mysql_fetch_array($risultato)) {

$mese = $record["mese"];

$totimp = $record["somma"];

echo "$mese &nbsp; $totimp <br>";

}

ottenendo questo:

01/2011   74828.88

02/2011   33936.85

12/2010   7801.00

quindi tutto ok.

ma se provo a produrre il grafico:

include ("config.php");
include "libchart/classes/libchart.php";
header("Content-type: image/png");

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>
   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
   <title>grafico</title>
</head>

<body>
<?
$querystat = "SELECT SUM(importo) somma, DATE_FORMAT(datain,'%m/%Y') mese FROM scadenze GROUP BY mese";
$risultato = mysql_query($querystat);


$chart = new VerticalBarChart(500,250);
   
   $dataSet = new XYDataSet();


while ($record = mysql_fetch_array($risultato)) {
$mese = $record["mese"];
$totimp = $record["somma"];

$dataSet->addPoint(new Point("$mese", $totimp));
}
$chart->setDataSet($dataSet);
   
   $chart->setTitle("Dati mese/totali x mese");
   $chart->render();

?>

</body>
</html>

come output mi ritrovo con il messaggio:

"L'immagine "http://localhost/prova/statgraf.php non può essere visualizzata perchè contiene degli errori".

Eppure sembra che dovrebbe esserci un'immagine visto che se ci vado sopra col mouse questo si trasforma in una lente di ingrandimento.

Qual'è l'errore?

Grazie

risposto 5 anni fa
frankphp
X 0 X

Ok ho fatto delle modifiche (ho dato un'occhiata ai demo presenti nella cartella del pacchetto scaricato) adesso sembra tutto ok  ;D ;D :D

include ("config.php");
include "libchart/classes/libchart.php";
$querystat = "SELECT SUM(importo) somma, DATE_FORMAT(datain,'%m/%Y') mese FROM scadenze GROUP BY mese";
$risultato = mysql_query($querystat);


$chart = new VerticalBarChart(500,250);
   
   $dataSet = new XYDataSet();


while ($record = mysql_fetch_array($risultato)) {
$mese = $record["mese"];
$totimp = $record["somma"];

$dataSet->addPoint(new Point("$mese", $totimp));
}
$chart->setDataSet($dataSet);
   
   $chart->setTitle("Dati mese/totali x mese");
   $chart->render("generated/demo1.png");

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   <title>Libchart vertical bars demonstration</title>
   <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15" />
</head>
<body>
   <img alt="Vertical bars chart" src="generated/demo1.png" style="border: 1px solid gray;"/>
</body>
</html>

questo il risultato grafico:

ok ok devo sistemare un po' l'ordine di stampa ma per il resto sembra che funzioni.

Ciao e grazie

risposto 5 anni fa
frankphp
X 0 X

ok

adesso viene la parte più difficile credo.

facendo una piccola modifica alla query ottengo un grafico del genere:

che in pratica somma le operazioni effettuate in una certa data e produce il grafico per il periodo interessato (tutto ciò che è presente nel db adesso..devo aggiungere quando sarà l'intervallo di tempo alla query)

con i mesi di dicembre 2010, gennaio e febbraio 2011 tutti in un solo grafico.

Io semplicemente vorrei invece dividere il grafico di cui sopra in altri 3 separati (uno per ogni mese interessato).

Come potrei fare?

Grazie

risposto 5 anni fa
frankphp
X 0 X

Per prima cosa devi capire quali sono i mesi interessati. Poi effettui tante query quanto sono i mesi, inserendo delle condizioni sulle data in base al mese. Ciascuna query genererà un grafico.

 :bye:

risposto 5 anni fa
Gianni Tomasicchio
X 0 X

Per prima cosa devi capire quali sono i mesi interessati. Poi effettui tante query quanto sono i mesi, inserendo delle condizioni sulle data in base al mese. Ciascuna query genererà un grafico.

 :bye:

Difficile per me.

Per i mesi interessati dipende dall'intervallo di tempo selezionato dall'utente. Qui non dovrebbero esserci particolari problemi. Ho già usato nelle query una cosa del genere:

....and datascad >= str_to_date('$inizio', '%d/%m/%Y') and datascad <= str_to_date('$fine', '%d/%m/%Y')

Calcolarli quanti sono (e magari pure quali sono se voglio stamparli sull'intestazione del grafico) adesso non mi viene in mente come fare.

Poi, effettuare tante query in un while o ciclo for se ho capito bene questo punto.

dici: " inserendo delle condizioni sulle data in base al mese"

Non ho capito cosa esattamente intendi e cosa dovrei fare qui.

Beh lo sapevo già che la faccenda sarebbe stata un pochino complicata (per me ovviamente).

Mi sa che a questo punto mi ci vuole un po' di codice su cui poter ragionare.

Dai Gianni!

Quello che ero in grado di fare l'ho fatto.

Grazie

ps: prevedo un altro thread lungo,  con tante risposte e visite, come nella mia migliore tradizione  ;D ;D

risposto 5 anni fa
frankphp
modificato 5 anni fa
X 0 X

alla fine ho messo insieme questa query:

...

foreach($mesitot as $valore)
{

$anno = conv_date_anno ($valore);
$mese = conv_date_mese ($valore);


$querystat = "SELECT SUM(importo) somma, DATE_FORMAT(datascad,'%d/%m/%Y') giorno FROM scadenze 
 where YEAR(datascad) = $anno AND MONTH(datascad) = $mese AND datascad
    BETWEEN STR_TO_DATE(  '$inizio',  '%d/%m/%Y' ) AND STR_TO_DATE(  '$fine',  '%d/%m/%Y' ) GROUP BY giorno ORDER BY datascad";

......
 

il codice dovrebbe sommare gli importi giornalieri prodotti in un mese (e lo fa) i giorni

poi sono stampati all'interno del loro mese di appartenenza.

Sembrava funzionare. Ma il codice sembra inaffidabile.

Se seleziono un intervallo dal

25/01/2011

al

28/02/2011

i risultati sono giusti.

se seleziono dal

28/01/2011

al

16/02/2011

mi riporta solo il mese di gennaio

anche se ci sono operazioni prima del 16/02 nel mese di febbraio

Non capisco quale possa essere l'errore.

ciao

risposto 5 anni fa
frankphp
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda