Prova questo.
Un consiglio. Se il tuo campo data è di tipo CHAR o VARCHAR, per potere ordinare le date in maniera corretta devono avere il formato SSAAMMGG (esempio 20161031 o 2017-01-01). Se hai un formato GGMMSSAA (esempio 01/01/2017) allora non funzionerà. Il 20/02/2017 apparira prima del 31/01/2017 per esempio.
Codice PHP:
<?php
define('DB_HOST', '127.0.0.1');
define('DB_NAME', 'tests');
define('DB_USER', 'root');
define('DB_PWD' , '');
$bdd = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME,DB_USER,DB_PWD, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
$query = "SELECT `data`, `nome`,count(*) as conta FROM `tab` group by `data`,`nome` order by `data`, `nome`";
$prepared = $bdd->prepare($query);
$prepared->execute();
$result = $prepared->fetchAll();
$arrDate = array();
$arrNomi = array();
$arrFina = array();
foreach($result as $subArray) {
if (!in_array($subArray['data'],$arrDate)) {$arrDate[] = $subArray['data'];}
if (!in_array($subArray['nome'],$arrNomi)) {$arrNomi[] = $subArray['nome'];}
$arrFina[$subArray['data']][$subArray['nome']] = $subArray['conta'];
}
?>
<table border="1px">
<tr align='center' >
<td>
</td><?php
foreach($arrDate as $key => $value) {?>
<td><?php print $value;?></td><?php
} ?>
</tr>
<?php
foreach($arrNomi as $keyNomi => $valNomi) {?>
<tr align='center' style="border:1px solid black">
<td><?php print $valNomi;?></td><?php
foreach($arrDate as $keyDate => $valDate) {?>
<td><?php print (isset($arrFina[$valDate][$valNomi]) ? $arrFina[$valDate][$valNomi] : "");?></td><?php
}?>
</tr><?php
}?>
</table>
I dati
170219-001.JPG
Il risultato
170219-002.JPG