Sto dando la mia risposta perché ho dubbi significativi sulle altre risposte. Devi stare attento ai requisiti del filtro. Ricorda, la clausola where corre dopo i tuoi join . Quindi, se sono presenti requisiti di filtro nella clausola where che si riferiscono alla tabella non-outer join, hai (in molte circostanze) annullato il tuo outer join. Quindi, prendendo il tuo sql, sembra che la soluzione più semplice sia usare il join corretto o spostare i nomi delle tabelle in modo appropriato, quindi spostare le condizioni del filtro fuori dalla clausola where e nella clausola join.
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
Un altro modo che credo dovrebbe essere equivalente è
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
Poiché non è strettamente importante dove siano i requisiti del filtro su fs_fault. (e il tuo motore SQL cambierà comunque tutto).
Modifica:ecco un SQLFiddle dimostrando il filtraggio sulla clausola join rispetto alla clausola where.