Replace your first INNER JOINs to a RIGHT JOIN / LEFT JOIN:
SELECT normesTypesDemande.choix AS nomTypeDemande, normesLois.choix AS nomLoi, COUNT(*) as nbDemandes FROM ((gestionDemandes.typeNormes RIGHT JOIN gestionDemandes.normesLois ON typeNormes.loi = normesLois.id) LEFT JOIN gestionDemandes.normesTypesDemande ON typeNormes.typeDemande = normesTypesDemande.id) LEFT JOIN gestionDemandes.demandes ON typeNormes.demande = demandes.id GROUP BY normesTypesDemande.choix, normesLois.choix ORDER BY normesTypesDemande.choix
Because of that INNER JOIN and no corresponding rows to count for Comité - SAE for example, the INNER JOIN will filter the SAE row.
Changing it to a RIGHT JOIN will ensure that no data from normesLois will be excluded, and you should have your 0 counts.
Update:
Well, not the most elegant, but here is the solution:
SELECT nomTypeDemande , choix , sum(nbDemandes) AS nbDemandes FROM ( SELECT r.nomTypeDemande , nl.choix , CASE WHEN r.nomLoi = nl.choix THEN sum(r.nbDemandes) ELSE 0 END AS nbDemandes FROM ( SELECT normesTypesDemande.choix AS nomTypeDemande , normesLois.choix AS nomLoi , COUNT(typeNormes.id) AS nbDemandes FROM normesLois FULL JOIN typeNormes ON typeNormes.loi = normesLois.id FULL JOIN normesTypesDemande ON typeNormes.typeDemande = normesTypesDemande.id GROUP BY normesTypesDemande.choix , normesLois.choix ) r CROSS JOIN normesLois nl GROUP BY r.nomTypeDemande , nl.choix , r.nomLoi ) r GROUP BY nomTypeDemande , choix ORDER BY nomTypeDemande , choix