Scusami...non ho proprio visto che suddividevi anche per anno. Allora io farei così:
Codice 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),
//ect
];
$query =
"SELECT DATE_FORMAT(date, \"%c-%Y\") as data, SUM(total) as totale
FROM `tabella`
WHERE YEAR(date) BETWEEN 2016 AND 2020
GROUP BY data";
while($data = ... //loop nel risultato query){
$d = explode('-', $data['data']); // in $d[0] ho il mese, in $d[1] l'anno;
$fatturati[$d[1]][$d[0]] = $data['totale'];
}
?>
<table>
<tr>
<th>2016</th>
<th>2017</th>
...
</tr>
<?php
$anni = array_keys($fatturati);
for($i=1; $i<=12;$i++){
echo "<tr>";
foreach($anni as $anno){
echo '<td>'.$fatturati[$anno][$i].'</td>';
}
echo "</tr>";
}
?>
</table>
Ovviamente gli anni in $fatturati devono essere quelli che poi prendi nella query.
PS: Ci possono essere degli errori, ma il concetto è questo