Popolare campi tabella con totali estratti da database

elpirata

Utente Attivo
18 Mar 2009
230
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
 

macus_adi

Utente Attivo
5 Dic 2017
1.141
65
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
230
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.141
65
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
230
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
230
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
230
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
2.735
141
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
230
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

marino51

Utente Attivo
28 Feb 2013
2.735
141
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
230
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
2.735
141
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
2.735
141
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
230
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
2.735
141
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
2.735
141
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
2.735
141
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
230
7
18
Nessun errore di esecuzione, ma come da te previsto i totali correttamente valorizzati

totali_corretti.png