Je veux get des données si les loggings ne sont pas présents dans un mois spécifique

J'ai écrit une requête sql pour que tous les loggings arrivent dans un mois spécifique

select month(loggingdate),Count(id) from communicationlogs where clientid=20154 and month(loggingdate) in (1,2,3,4,5,6,7,8,9) group by month(loggingdate) 7 65 8 5 

ici les loggings sont présents au 7ème et 8ème mois. Je veux get la valeur 0 pour les autres numéros de mois comme …

 1 0 2 0 3 0 4 0 ... 

C'est un problème standard où une table de calendar est pratique. Une table de calendar, comme son nom l'indique, est une table qui stocke juste une séquence de dates. Dans votre cas particulier, nous n'avons besoin que des numbers correspondant aux 12 mois. Commencez la requête avec la table de calendar, puis joignez la jointure à votre requête d'agrégation en tant que sous-requête.

Notez l'utilisation de COALESCE ci-dessous. Si un mois donné n'apparaît nulle part dans votre requête d'origine, son nombre apparaîtra comme NULL dans la jointure, auquel cas nous signalerons zéro pour ce mois.

 WITH calendar_month AS ( SELECT 1 AS month UNION ALL SELECT month +1 FROM calendar_month WHERE month +1 <= 12 ) SELECT t1.month, COALESCE(t2.cnt, 0) AS cnt FROM calendar_month t1 LEFT JOIN ( SELECT MONTH(loggingdate) as month, COUNT(id) AS cnt FROM communicationlogs WHERE clientid = 20154 AND MONTH(loggingdate) IN (1,2,3,4,5,6,7,8,9) GROUP BY MONTH(loggingdate) ) t2 ON t1.month = t2.month