Je donne ma réponse car j'ai des doutes importants sur les autres réponses. Vous devez faire attention aux exigences de filtrage. N'oubliez pas que la clause where s'exécute après vos jointures . Donc, s'il y a des exigences de filtre dans la clause where qui font référence à la table jointe non externe, vous avez (dans de nombreuses circonstances) annulé votre jointure externe. Donc, en prenant votre sql, il semble que la solution la plus simple soit d'utiliser la bonne jointure ou de déplacer les noms de table de manière appropriée, puis de déplacer les conditions de filtre hors de la clause where et dans la clause de jointure.
SELECT f.faultcode, f.downloadtimeid, d.downloadtime, count(*) as faultcount
FROM download_time d
RIGHT OUTER JOIN fs_fault f ON
f.downloadtimeid = d.id
AND f.faultcode IN (1000,1100)
AND f.statusid IN(2, 4)
AND d.downloadtime BETWEEN '04/11/2011' AND '05/01/2012')
AND d.bunoid = 166501
GROUP BY d.bunoid, f.downloadtimeid, d.downloadtime, f.faultcode
Une autre façon qui, je pense, devrait être équivalente est
SELECT f.faultcode, f.downloadtimeid, d.downloadtime, count(*) as faultcount
FROM download_time d
RIGHT OUTER JOIN fs_fault f ON
f.downloadtimeid = d.id
AND d.downloadtime BETWEEN '04/11/2011' AND '05/01/2012')
AND d.bunoid = 166501
WHERE
f.faultcode IN (1000,1100)
AND f.statusid IN(2, 4)
GROUP BY d.bunoid, f.downloadtimeid, d.downloadtime, f.faultcode
Comme peu importe où se trouvent les exigences de filtrage sur fs_fault. (et votre moteur SQL va tout changer de toute façon).
Modifier :Voici un SQLFiddle démonstration du filtrage sur la clause de jointure par rapport à la clause where.