Dos formas....
Agregando una tabla fija con los meses a la query mediante un left join y usando IFNULL(... ,0).
En la programación externa recorrer un array con los meses para poner las cabeceras de las colunas y lego los datos en la columna que toque....
Basicamente es la misma solución quizas es más facil la primera pero no es muy elegante des del punto de vista de bbdd.
Cita: GROUP BY MONTH(PI.date_invoice)
Estas agregando solo por el mes y deberias agregar por año y mes.... bueno si solo tienes en cuenta nueve meses es igual....