La cabecera con los nombres de los meses yo la generaria aparte, con los meses sin saltos....
Luego obtendria los datos asegurandome que me llegan ordenados por usuario y mes...
usuario;mes;dato
usuario1,1,dato
usuario1,3,dato
usuario2,1,dato
usuario2,2,dato
usuario3,2,dato
Necesitas variables para saber cual es el usuario anterior y cual es el mes anterior, y resetearlas convenientemente cada vez que haya un cambio...
$usuarioAnt="";
$mesAnt=0;
A partir de aqui un bucle que lea los datos y que para cada cambio en el usuario
(comparando con $usuarioAnt recuerda resetearla con el nuevo valor) introduzca tantos
(esto en el primer usuario no toca)
como meses falten para llegar al ultimo y el salto de linea y el nombre
y para cada mes introduzca el dato siempre que el mes sea el que toca, como vienen ordenados es fácil de ver...
Si mes es el siguiente introduzco
si no es el siguiente introduzco tantos
como meses se hayan saltado....y
para el mes en cuestion...
Al final recuerda cerrar la tabla con tantos
como meses falten para llegar al ultimo y
Hasta aqui puedo leer sin solucionartelo....