Popolare campi tabella con totali estratti da database

elpirata

Utente Attivo
18 Mar 2009
264
7
18
Un saluto a tutto il forum,
avrei bisogno del vostro supporto per realizzare una tabella che inserisca il fatturato aziendale totale mensile anno per anno.

Ho creato con php questa tabella:

HTML:
<!DOCTYPE html>
<html lang="it">
<head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <meta http-equiv="X-UA-Compatible" content="ie=edge">
   <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
   <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
   <title>Document</title>
</head>
<body>
<?php
echo"
<table class='table table-bordered table-striped'>
 <thead>
   <tr>
     <th scope='col'></th>
     <th class='text-center' scope='col'>
       Incasso<br>
       2016
     </th>
     <th class='text-center' scope='col'>
       Incasso<br>
       2017
     </th>
     <th class='text-center' scope='col'>
       Incasso<br>
       2018
     </th>
     <th class='text-center' scope='col'>
       Incasso<br>
       2019
     </th>
     <th class='text-center' scope='col'>
       Incasso<br>
       2020
     </th>
   </tr>
 </thead>
 <tbody>
   <tr>
     <th class='text-nowrap' scope='row'>Gennaio</th>
     <td>Qua deve valorizzare Gennaio 2016</td>
   </tr>
   <tr>
     <th class='text-nowrap' scope='row'>Febbraio</th>
     <td>Qua deve valorizzare Febbraio 2016</td>
   </tr>
   <tr>
     <th class='text-nowrap' scope='row'>Marzo</th>
     <td>Qua deve valorizzare Marzo 2016</td>
   </tr>
   <tr>
     <th class='text-nowrap' scope='row'>Aprile</th>
     <td>Qua deve valorizzare Aprile 2016</td>
   </tr>
   <tr>
     <th class='text-nowrap' scope='row'>Maggio</th>
     <td>Qua deve valorizzare Maggio 2016</td>
   </tr>
   <tr>
     <th class='text-nowrap' scope='row'>Giugno</th>
     <td>Qua deve valorizzare Giugno 2016</td>
   </tr>
   <tr>
   <th class='text-nowrap' scope='row'>Luglio</th>
   <td>Qua deve valorizzare Luglio 2016</td>
   </tr>
   <th class='text-nowrap' scope='row'>Agosto</th>
   <td>Qua deve valorizzare Agosto 2016</td>
   </tr>
   <th class='text-nowrap' scope='row'>Settembre</th>
   <td>Qua deve valorizzare Settembre 2016</td>
   </tr>
   <th class='text-nowrap' scope='row'>Ottobre</th>
   <td>Qua deve valorizzare Ottobre 2016</td>
   </tr>
   <th class='text-nowrap' scope='row'>Novembre</th>
   <td>Qua deve valorizzare Novembre 2016</td>
   </tr>
   <th class='text-nowrap' scope='row'>Dicembre</th>
   <td>Qua deve valorizzare Dicembre 2016</td>
   </tr>
 </tbody>";
echo"</table>";  
?>
   
</body>
</html>

i dati sono memorizzati all'interno di un database mysql, naturalmente nel database ho un campo che si chiama: totale di tipo decimal(10,2) ma e memorizza il totale per ogni singolo lavoro eseguito.

In tutta sostanza dovrei scrivere una query che:
selezioni tutti i lavori eseguiti dal 01/01/2016 al 31/01/2016 e ne mostri il totale nella cella
HTML:
<td>Qua deve valorizzare Gennaio 2016</td>
e cosi per tutte le celle di tutti gli anni.

Mi dareste una mano a comprendere come gestire la situazione

Grazie anticipatamente
what.gif
 

macus_adi

Utente Attivo
5 Dic 2017
1.333
90
48
IT/SW
Concettualmente è cosi:
Sommo tutti i valori facente parte dello stesso anno e dello stesso mese, ragruppandoli per mese.....
Ossia: Per ogni mese che appartiene all'anno selezionato somma i valori....

Codice:
SELECT
  DATE_FORMAT(datetime, "%Y") AS anno,
  DATE_FORMAT(datetime, "%m") AS mese,
  SUM(val) AS media
FROM TABELLA
GROUP BY 
  DATE_FORMAT(datetime, "%m")
   DATE_FORMAT(datetime, "%Y"),
 

elpirata

Utente Attivo
18 Mar 2009
264
7
18
SELECT DATE_FORMAT(datetime, "%Y") AS anno, DATE_FORMAT(datetime, "%m") AS mese, SUM(val) AS media FROM TABELLA GROUP BY DATE_FORMAT(datetime, "%m") DATE_FORMAT(datetime, "%Y"),

CIao @macus_adi ,
grazie per il suggerimento, purtroppo sono molto arruginito e non riesco a venirne a capo, se provo ad eseguire in mysql il codice da te postato ottengo un errore

MySQL server version for the right syntax to use near 'DATE_FORMAT(datetime, "%Y") LIMIT 0, 30' at line 8

e se sono a questo figuriamoci integrarlo come codice php :oops:
 

macus_adi

Utente Attivo
5 Dic 2017
1.333
90
48
IT/SW
se provo ad eseguire in mysql il codice da te postato ottengo un errore
Pensi che sappia il field_name del tuo database, senza specifiche?
Hai copiato una query senza verificare i nomi dei tuoi campi!
Codice:
SELECT
  DATE_FORMAT(QUI_CI_VA_IL_NOME_DEL_CAMPO, "%Y") AS anno,
  DATE_FORMAT(QUI_CI_VA_IL_NOME_DEL_CAMPO, "%m") AS mese,
  SUM(QUI_CI_VA_IL_NOME_DEL_CAMPO_DEI_TOTALI) AS media
FROM TABELLA
GROUP BY
  DATE_FORMAT(QUI_CI_VA_IL_NOME_DEL_CAMPO, "%m")
   DATE_FORMAT(QUI_CI_VA_IL_NOME_DEL_CAMPO, "%Y"),
Forse così si capisce meglio!
 

elpirata

Utente Attivo
18 Mar 2009
264
7
18
Ciao, scusami tu se sono stato poco chiaro nella precedente
la query naturalmente non l'ho copiata pari pari, ma l'ho valorazzata con i field_name del mio db,

SQL:
SELECT
  DATE_FORMAT(data, "%Y") AS anno,
  DATE_FORMAT(data, "%m") AS mese,
  SUM(totale) AS media
FROM commesse
GROUP BY
  DATE_FORMAT(data, "%m")
   DATE_FORMAT(data, "%Y")

data.png
 

elpirata

Utente Attivo
18 Mar 2009
264
7
18
Sarebbe corretto,
per tamponare risalire al fatturato di gennaio scrivendo una query in questo modo ?

PHP:
$gennaio16 = "SELECT SUM(totale) FROM commesse WHERE data BETWEEN ('2016-01-01') AND ('2016-12-01')";
$rs_gennaio16 = $mysqli->query($gennaio16);
$fatt_gennaio16 = mysqli_fetch_assoc($rs_gennaio16);
 

elpirata

Utente Attivo
18 Mar 2009
264
7
18
Per dovere di cronaca, per il momento sto ovviando al problema scrivendo il tutto query per query, almeno tampono l'esigenza che ho, se qualche anima pia avesse tempo e modo di darmi una mano, sarei infinitamente grato, per il momento lascio il codice per chi magari un giorno dovesse avere la mia stessa esigenza, non è assolutamente corretto scriverlo così ma per tamponare direi che potrebbe andar bene:


PHP:
<?php


/*SCRIVO LA QUERY per GENNAIO*/
$gennaio16 = "SELECT SUM(totale) FROM commesse WHERE data BETWEEN ('2016-01-01') AND ('2016-12-31')";
$rs_gennaio16 = $mysqli->query($gennaio16);
$fatt_gennaio16 = mysqli_fetch_assoc($rs_gennaio16);

$gennaio17 = "SELECT SUM(totale) FROM commesse WHERE data BETWEEN ('2017-01-01') AND ('2017-12-31')";
$rs_gennaio17 = $mysqli->query($gennaio17);
$fatt_gennaio17 = mysqli_fetch_assoc($rs_gennaio17);

$gennaio18 = "SELECT SUM(totale) FROM commesse WHERE data BETWEEN ('2018-01-01') AND ('2018-12-31')";
$rs_gennaio18 = $mysqli->query($gennaio18);
$fatt_gennaio18 = mysqli_fetch_assoc($rs_gennaio18);

$gennaio19 = "SELECT SUM(totale) FROM commesse WHERE data BETWEEN ('2019-01-01') AND ('2019-12-31')";
$rs_gennaio19 = $mysqli->query($gennaio19);
$fatt_gennaio19 = mysqli_fetch_assoc($rs_gennaio19);

$gennaio20 = "SELECT SUM(totale) FROM commesse WHERE data BETWEEN ('2020-01-01') AND ('2020-12-31')";
$rs_gennaio20 = $mysqli->query($gennaio20);
$fatt_gennaio20 = mysqli_fetch_assoc($rs_gennaio20);



/*SCRIVO LA QUERY per FEBBRAIO*/
$febbraio16 = "SELECT SUM(totale) FROM commesse WHERE data BETWEEN ('2016-02-01') AND ('2016-12-31')";
$rs_febbraio16 = $mysqli->query($febbraio16);
$fatt_febbraio16 = mysqli_fetch_assoc($rs_febbraio16);

$febbraio17 = "SELECT SUM(totale) FROM commesse WHERE data BETWEEN ('2017-02-01') AND ('2017-12-31')";
$rs_febbraio17 = $mysqli->query($febbraio17);
$fatt_febbraio17 = mysqli_fetch_assoc($rs_febbraio17);



echo"
<table class='table table-bordered table-striped'>
  <thead>
    <tr>
      <th scope='col'></th>
      <th class='text-center' scope='col'>
        Incasso<br>
        2016
      </th>

      <th class='text-center' scope='col'>
        Incasso<br>
        2017
      </th>

      <th class='text-center' scope='col'>
        Incasso<br>
        2018
      </th>

      <th class='text-center' scope='col'>
        Incasso<br>
        2019
      </th>

      <th class='text-center' scope='col'>
        Incasso<br>
        2020
      </th>
    </tr>
  </thead>

  <tbody>

    <tr>
      <th class='text-nowrap' scope='row'>Gennaio</th>
      <td>€ {$fatt_gennaio16['SUM(totale)']}</td>
      <td>€ {$fatt_gennaio17['SUM(totale)']}</td>
      <td>€ {$fatt_gennaio18['SUM(totale)']}</td>
      <td>€ {$fatt_gennaio19['SUM(totale)']}</td>
      <td>€ {$fatt_gennaio20['SUM(totale)']}</td>
    </tr>

    <tr>
      <th class='text-nowrap' scope='row'>Febbraio</th>
      <td>€ {$fatt_febbraio16['SUM(totale)']}</td>
      <td>€ {$fatt_febbraio17['SUM(totale)']}</td>
      <td>Qua deve valorizzare Febbraio 2018</td>
      <td>Qua deve valorizzare Febbraio 2019</td>
      <td>Qua deve valorizzare Febbraio 2020</td>
    </tr>

    <tr>
      <th class='text-nowrap' scope='row'>Marzo</th>
      <td>Qua deve valorizzare Marzo 2016</td>
      <td>Qua deve valorizzare Marzo 2017</td>
      <td>Qua deve valorizzare Marzo 2018</td>
      <td>Qua deve valorizzare Marzo 2019</td>
      <td>Qua deve valorizzare Marzo 2020</td>
    </tr>

    <tr>
      <th class='text-nowrap' scope='row'>Aprile</th>
      <td>Qua deve valorizzare Aprile 2016</td>
      <td>Qua deve valorizzare Aprile 2017</td>
      <td>Qua deve valorizzare Aprile 2018</td>
      <td>Qua deve valorizzare Aprile 2019</td>
      <td>Qua deve valorizzare Aprile 2020</td>
    </tr>

    <tr>
      <th class='text-nowrap' scope='row'>Maggio</th>
      <td>Qua deve valorizzare Maggio 2016</td>
      <td>Qua deve valorizzare Maggio 2017</td>
      <td>Qua deve valorizzare Maggio 2018</td>
      <td>Qua deve valorizzare Maggio 2019</td>
      <td>Qua deve valorizzare Maggio 2020</td>
    </tr>

    <tr>
      <th class='text-nowrap' scope='row'>Giugno</th>
      <td>Qua deve valorizzare Giugno 2016</td>
      <td>Qua deve valorizzare Maggio 2017</td>
      <td>Qua deve valorizzare Maggio 2018</td>
      <td>Qua deve valorizzare Maggio 2019</td>
      <td>Qua deve valorizzare Maggio 2020</td>
    </tr>

    <tr>
    <th class='text-nowrap' scope='row'>Luglio</th>
    <td>Qua deve valorizzare Luglio 2016</td>
    <td>Qua deve valorizzare Luglio 2017</td>
    <td>Qua deve valorizzare Luglio 2018</td>
    <td>Qua deve valorizzare Luglio 2019</td>
    <td>Qua deve valorizzare Luglio 2020</td>
    </tr>

    <th class='text-nowrap' scope='row'>Agosto</th>
    <td>Qua deve valorizzare Agosto 2016</td>
    <td>Qua deve valorizzare Agosto 2017</td>
    <td>Qua deve valorizzare Agosto 2018</td>
    <td>Qua deve valorizzare Agosto 2019</td>
    <td>Qua deve valorizzare Agosto 2020</td>
    </tr>

    <th class='text-nowrap' scope='row'>Settembre</th>
    <td>Qua deve valorizzare Settembre 2016</td>
    <td>Qua deve valorizzare Settembre 2017</td>
    <td>Qua deve valorizzare Settembre 2018</td>
    <td>Qua deve valorizzare Settembre 2019</td>
    <td>Qua deve valorizzare Settembre 2020</td>
    </tr>

    <th class='text-nowrap' scope='row'>Ottobre</th>
    <td>Qua deve valorizzare Ottobre 2016</td>
    <td>Qua deve valorizzare Ottobre 2017</td>
    <td>Qua deve valorizzare Ottobre 2018</td>
    <td>Qua deve valorizzare Ottobre 2019</td>
    <td>Qua deve valorizzare Ottobre 2020</td>
    </tr>

    <th class='text-nowrap' scope='row'>Novembre</th>
    <td>Qua deve valorizzare Novembre 2016</td>
    <td>Qua deve valorizzare Novembre 2017</td>
    <td>Qua deve valorizzare Novembre 2018</td>
    <td>Qua deve valorizzare Novembre 2019</td>
    <td>Qua deve valorizzare Novembre 2020</td>
    </tr>

    <th class='text-nowrap' scope='row'>Dicembre</th>
    <td>Qua deve valorizzare Dicembre 2016</td>
    <td>Qua deve valorizzare Dicembre 2017</td>
    <td>Qua deve valorizzare Dicembre 2018</td>
    <td>Qua deve valorizzare Dicembre 2019</td>
    <td>Qua deve valorizzare Dicembre 2020</td>
    </tr>
  </tbody>";
echo"</table>"; 
?>
 

marino51

Utente Attivo
28 Feb 2013
3.036
192
63
Lombardia
premesso che anche con date_format, dovrebbe funzionare, ma non avendo mysql per poter provare,
ti suggerisco di usare
SQL:
SELECT
  YEAR(data)  AS anno,
  MONTH(data) AS mese,
  SUM(totale) AS totale
FROM commesse
WHERE data BETWEEN '2016-01-01' AND '2019-12-31'
GROUP BY MONTH(data), YEAR(data)
ORDER BY MONTH(data), YEAR(data)
 

elpirata

Utente Attivo
18 Mar 2009
264
7
18
Un saluto a tutti,
per i posteri lascio il codice che mi è servito per risolvere il problema

PHP:
<?php
$fatturati = ['2016'=>array_fill_keys(range(1,12),0),
                   '2017'=>array_fill_keys(range(1,12),0),
                   '2018'=>array_fill_keys(range(1,12),0),
                   '2019'=>array_fill_keys(range(1,12),0),
                   '2020'=>array_fill_keys(range(1,12),0),
                  
 ];

$query =
"SELECT DATE_FORMAT(data, \"%c-%Y\") as meseanno, SUM(totale) as totalemese
FROM `commesse`
WHERE YEAR(data) BETWEEN 2016 AND 2020
GROUP BY meseanno";

$result = $mysqli->query($query);
while($data = mysqli_fetch_assoc($result)){
    $d = explode('-', $data['meseanno']); // in $d[0] ho il mese, in $d[1] l'anno;
    $fatturati[$d[1]][$d[0]] = $data['totalemese'];
}

// CREO UN ARRAY DI MESI
$mesi = [1=>'Gennaio', 2=>'Febbraio', 3=>'Marzo', 4=>'Aprile', 5=>'Maggio', 6=>'Giugno', 7=>'Luglio', 8=>'Agosto', 9=>'Settembre', 10=>'Ottobre', 11=>'Novembre', 12=>'Dicembre'];
?>

<table class='table table-striped > fatturato'>
  <thead>
    <tr>
      <th scope='col'></th>
      <th class='intestazione_fatturato' scope='col'>
        Incasso<br>
        2016
      </th>

      <th class='intestazione_fatturato' scope='col'>
        Incasso<br>
        2017
      </th>

      <th class='intestazione_fatturato' scope='col'>
        Incasso<br>
        2018
      </th>

      <th class='intestazione_fatturato' scope='col'>
        Incasso<br>
        2019
      </th>

      <th class='intestazione_fatturato' scope='col'>
        Incasso<br>
        2020
      </th>
    </tr>
  </thead>

  <tbody>
  <?php
       $anni = array_keys($fatturati);
       for($i=1; $i<=12;$i++){
           echo '<tr><td>'.$mesi[$i].'</td>';
           foreach($anni as $anno){
              echo '<td> € '.$fatturati[$anno][$i].'</td>';
           }
           echo "</tr>";
      }
      ?>
  <?php
    echo '<tr style="color:yellow; font-weight: bold; text-align:left;">';
    echo '<th class="text-nowrap" scope="row" style="background-color:black;">Totale Incasso</th>';
      
    ...come posso impostare la query per ottenere i totali ?

      ?>
</tbody>
</table>



Adesso avrei solo la necessità, per ogni anno ottenere il totale incasso,
 

Allegati

  • totali.png
    totali.png
    42 KB · Visite: 160

marino51

Utente Attivo
28 Feb 2013
3.036
192
63
Lombardia
hai estratto "DATE_FORMAT(data, \"%c-%Y\") as meseanno" dal db
per poi separare i due valori "$d = explode('-', $data['meseanno']);"

se tu avessi estratto dal db i 2 valori separati,
potevi avere 2 select in "union"

la prima che sommava per mese
la seconda con mese 13 che sommava per anno,

la 13a riga avrebbe potuto contenere i totali e non sarebbe stato necessario scrivere altro codice se non modificando
"12=>'Dicembre', 13=>'Totale anno'"
 

elpirata

Utente Attivo
18 Mar 2009
264
7
18
Ciao Marino51,
anzitutto grazie per avermi risposto,
secondo te allo stato attuale come potrei ovviare al problema senza andare a stravolgere tutto ?
 

marino51

Utente Attivo
28 Feb 2013
3.036
192
63
Lombardia
l'array dei fatturati la porti a 13 elementi

la query diventa,
SQL:
SELECT
  DATE_FORMAT(data, \"%c\") as mese
, DATE_FORMAT(data, \"%Y\") as anno
, SUM(totale) as totalemese
FROM `commesse`
WHERE YEAR(data) BETWEEN 2016 AND 2020
GROUP BY mese, anno
union
SELECT
  13 as mese
, DATE_FORMAT(data, \"%Y\") as anno
, SUM(totale) as totalemese
FROM `commesse`
WHERE YEAR(data) BETWEEN 2016 AND 2020
GROUP BY mese, anno
ORDER BY mese, anno

nel "while($data =" gestisci mese e anno separati

nell'array dei mesi aggiungi il tredicesimo elemento "12=>'Dicembre', 13=>'Totale anno'"

"for($i=1; $i<=12;$i++){" gestisci 13 elementi

credo sia tutto
 

marino51

Utente Attivo
28 Feb 2013
3.036
192
63
Lombardia
prova la query in questo modo
SQL:
SELECT
  DATE_FORMAT(data, \"%c-%Y\") as meseanno
, SUM(totale) as totalemese
FROM `commesse`
WHERE YEAR(data) BETWEEN 2016 AND 2020
GROUP BY meseanno
union
SELECT
  DATE_FORMAT(data, \"13-%Y\") as meseanno
, SUM(totale) as totalemese
FROM `commesse`
WHERE YEAR(data) BETWEEN 2016 AND 2020
GROUP BY meseanno

se funziona, risparmi la modifica del " while($data ="
 

elpirata

Utente Attivo
18 Mar 2009
264
7
18
Ciao Marino,
grazie per l'attenzione che stai dedicando alla risoluzione della mia richiesta, purtroppo non riesco ad implemetare il totale, diciamo che mi manca questo ultimo pezzo per completare il puzzle

PHP:
<?php
$fatturati = ['2016'=>array_fill_keys(range(1,12),0),
                   '2017'=>array_fill_keys(range(1,12),0),
                   '2018'=>array_fill_keys(range(1,12),0),
                   '2019'=>array_fill_keys(range(1,12),0),
                   '2020'=>array_fill_keys(range(1,12),0),
                 
];

$query =
"SELECT
DATE_FORMAT(data, \"%c\") as mese
, DATE_FORMAT(data, \"%Y\") as anno
, SUM(totale) as totalemese
FROM `commesse`
WHERE YEAR(data) BETWEEN 2016 AND 2020
GROUP BY mese, anno
union
SELECT
13 as mese
, DATE_FORMAT(data, \"%Y\") as anno
, SUM(totale) as totalemese
FROM `commesse`
WHERE YEAR(data) BETWEEN 2016 AND 2020
GROUP BY mese, anno
ORDER BY mese, anno";

$result = $mysqli->query($query);
while($data = mysqli_fetch_assoc($result)){
    $d = explode('-', $data['meseanno']); // in $d[0] ho il mese, in $d[1] l'anno;
    $fatturati[$d[1]][$d[0]] = $data['totalemese'];
}

// CREO UN ARRAY DI MESI
$mesi = [1=>'Gennaio', 2=>'Febbraio', 3=>'Marzo', 4=>'Aprile', 5=>'Maggio', 6=>'Giugno', 7=>'Luglio', 8=>'Agosto', 9=>'Settembre', 10=>'Ottobre', 11=>'Novembre', 12=>'Dicembre', 13=>'Totale'];
?>

<table class='table table-striped > fatturato'>
  <thead>
    <tr>
      <th scope='col'></th>
      <th class='intestazione_fatturato' scope='col'>
        Incasso<br>
        2016
      </th>

      <th class='intestazione_fatturato' scope='col'>
        Incasso<br>
        2017
      </th>

      <th class='intestazione_fatturato' scope='col'>
        Incasso<br>
        2018
      </th>

      <th class='intestazione_fatturato' scope='col'>
        Incasso<br>
        2019
      </th>

      <th class='intestazione_fatturato' scope='col'>
        Incasso<br>
        2020
      </th>
    </tr>
  </thead>

  <tbody>
  <?php
       $anni = array_keys($fatturati);
       for($i=1; $i<=12;$i++){
           echo '<tr><td>'.$mesi[$i].'</td>';
           foreach($anni as $anno){
              echo '<td> € '.$fatturati[$anno][$i].'</td>';
           }
           echo "</tr>";
      }
      ?>
  <?php
    echo '<tr style="color:yellow; font-weight: bold; text-align:left;">';
    echo '<th class="text-nowrap" scope="row" style="background-color:black;">Totale Incasso</th>';

      'qua dovrei inserire il codice per visualizzare il totale';

        echo "</tr>";
      ?>
</tbody>
</table>
 

marino51

Utente Attivo
28 Feb 2013
3.036
192
63
Lombardia
prova il codice sottostante e fai sapere l'effetto che fa ….
PHP:
<?php
$fatturati = ['2016'=>array_fill_keys(range(1,13),0),
              '2017'=>array_fill_keys(range(1,13),0),
              '2018'=>array_fill_keys(range(1,13),0),
              '2019'=>array_fill_keys(range(1,13),0),
              '2020'=>array_fill_keys(range(1,13),0),
                  
 ];

$query = "SELECT
  DATE_FORMAT(data, \"%c-%Y\") as meseanno
, SUM(totale) as totalemese
FROM `commesse`
WHERE YEAR(data) BETWEEN 2016 AND 2020
GROUP BY meseanno
union
SELECT
  DATE_FORMAT(data, \"13-%Y\") as meseanno
, SUM(totale) as totalemese
FROM `commesse`
WHERE YEAR(data) BETWEEN 2016 AND 2020
GROUP BY meseanno";

$result = $mysqli->query($query);
while($data = mysqli_fetch_assoc($result)){
    $d = explode('-', $data['meseanno']); // in $d[0] ho il mese, in $d[1] l'anno;
    $fatturati[$d[1]][$d[0]] = $data['totalemese'];
}

// CREO UN ARRAY DI MESI
$mesi = [1=>'Gennaio', 2=>'Febbraio', 3=>'Marzo', 4=>'Aprile', 5=>'Maggio', 6=>'Giugno', 7=>'Luglio', 8=>'Agosto', 9=>'Settembre', 10=>'Ottobre', 11=>'Novembre', 12=>'Dicembre', 13=>'Totale anno'];
?>

<table class='table table-striped > fatturato'>
  <thead>
    <tr>
      <th scope='col'></th>
      <th class='intestazione_fatturato' scope='col'>
        Incasso<br>
        2016
      </th>

      <th class='intestazione_fatturato' scope='col'>
        Incasso<br>
        2017
      </th>

      <th class='intestazione_fatturato' scope='col'>
        Incasso<br>
        2018
      </th>

      <th class='intestazione_fatturato' scope='col'>
        Incasso<br>
        2019
      </th>

      <th class='intestazione_fatturato' scope='col'>
        Incasso<br>
        2020
      </th>
    </tr>
  </thead>

  <tbody>
  <?php
       $anni = array_keys($fatturati);
       for($i=1; $i<=13;$i++){
           echo '<tr><td>'.$mesi[$i].'</td>';
           foreach($anni as $anno){
              echo '<td> € '.$fatturati[$anno][$i].'</td>';
           }
           echo "</tr>";
      }
  ?>
  <?php
//    echo '<tr style="color:yellow; font-weight: bold; text-align:left;">';
//    echo '<th class="text-nowrap" scope="row" style="background-color:black;">Totale Incasso</th>';
  ?>
</tbody>
</table>
 

marino51

Utente Attivo
28 Feb 2013
3.036
192
63
Lombardia
riprova con la query originale,
deve darti tutti i valori e solo i totali a zero
PHP:
$query = "SELECT
  DATE_FORMAT(data, \"%c-%Y\") as meseanno
, SUM(totale) as totalemese
FROM `commesse`
WHERE YEAR(data) BETWEEN 2016 AND 2020
GROUP BY meseanno";
 

marino51

Utente Attivo
28 Feb 2013
3.036
192
63
Lombardia
adesso prova con questa query, deve darti tutti i valori a zero e solo i totali
oppure un errore nella sua esecuzione
PHP:
$query = "SELECT
  DATE_FORMAT(data, \"13-%Y\") as meseanno
, SUM(totale) as totalemese
FROM `commesse`
WHERE YEAR(data) BETWEEN 2016 AND 2020
GROUP BY meseanno";
 

elpirata

Utente Attivo
18 Mar 2009
264
7
18
Nessun errore di esecuzione, ma come da te previsto i totali correttamente valorizzati

totali_corretti.png
 
Discussioni simili
Autore Titolo Forum Risposte Data
otto9due Popolare campi tabella excell da maschera access MS Access 0
D popolare campi tra th alla select PHP 36
L [MS Access] come popolare automaticamente i campi di una sottomaschera MS Access 8
S Popolare campi di input con metodo $.getJSON jQuery 6
K Popolare select con piu campi in orizzontale PHP 1
D Popolare array PHP 8
felino Excel: popolare una cella con la data di modifica della riga a cui appartiene Windows e Software 3
F classic asp popolare combo box javascript Presentati al Forum 1
V popolare tabella da mysql PHP 7
F (Vendo) Spazio Banner - Guest Post a poco prezzo su Blog popolare Vendere e Acquistare pubblicita' online 0
P popolare una select da input PHP 0
pup3770 Popolare random Database - per test MySQL 1
M Popolare menu a tendina in EDIT PHP 18
neo996sps [Laravel 5.1 + ajax] Popolare select concatenate Regioni, Province, Comuni PHP 1
W Popolare select da Jquery jQuery 2
D [Java] Popolare jtable da db Mysql con DefaulTableModel Java 1
B Cercare il nome più popolare su una tabella PHP 11
F Popolare tabella MySQL con i dati di un file .CVS MySQL 1
F popolare tendina con dati tabella PHP 4
L Popolare uitableviewcontroller partendo da uiviewcontroller Sviluppo app per iOS 0
K query per popolare una select tramite ajaxc php e xml ! Ajax 14
P Popolare una tabella da utenti: nazione, città, provincia PHP 0
S [risolto] Aiuto: ciclo php ( for / while). popolare select dinamicamente da array id. PHP 9
M Popolare una tabella con numero righe e colonne prefissate PHP 6
A funzione per popolare un drop down list Javascript 4
P Popolare tabella da file .sql PHP 0
P Popolare un Database da una mappa di google map PHP 7
S [ACCESS]: Database e interfaccia grafica, popolare caselle dinamicamente MS Access 0
P Popolare tabella da file .sql PHP 3
P [Vb.Net] Popolare un List View da database .NET Framework 1
neo996sps [Visual Studio] Popolare datagrid tramite query Visual Basic 0
garrincha Come faccio a far diventare popolare un video su youtube ? Social Media Marketing 3
neo996sps Popolare un array con dati prelevati tramite while PHP 5
Monital Popolare tabella con risultati di una query PHP 0
J Popolare tabella con risultati di una query PHP 2
L Flash AS3: popolare array di oggetti presenti in libreria Flash 0
T popolare database di una directory Database 1
M Popolare una Listview da database MySql PHP 5
S popolare il database CMS (Content Management System) 4
I Popolare una select da un'altra PHP 3
A popolare simpleConnect da php Flash 0
A popolare simpleConnect da php PHP 0
F popolare array in modo esatto Classic ASP 3
B Popolare combo in base ad un'altra combo Classic ASP 13
peppoweb Popolare un Lista a Tendina Dinamicamente PHP 2
X Popolare una select a selezione multipla?!?! PHP 1
G VBA OpenForm con WhereCondition + LIKE su campi differenti MS Access 5
B Stringa sql per ricerca su più campi Database 1
M Compilazione automatica campi in input stessa pagina PHP 0
MarcoGrazia Gestire lista campi vuoti in fase di autenticazione jQuery 1

Discussioni simili