Udzielam odpowiedzi, ponieważ mam poważne wątpliwości co do pozostałych odpowiedzi. Musisz uważać na wymagania dotyczące filtrów. Pamiętaj, że klauzula gdzie uruchamia się po Twoich przyłączeniach . Więc jeśli są jakieś wymagania dotyczące filtrów w klauzuli where które odnoszą się do tabeli sprzężonej poza zewnętrznymi, to (w wielu przypadkach) anulowałeś sprzężenie zewnętrzne. Biorąc więc pod uwagę swój sql, wydaje się, że najprostszym rozwiązaniem jest albo użycie odpowiedniego sprzężenia, albo odpowiednie przeniesienie nazw tabel, a następnie przeniesienie warunków filtrowania z klauzuli where do klauzuli 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
Innym sposobem, który moim zdaniem powinien być równoważny, jest
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
Ponieważ nie ma ściśle znaczenia, gdzie są wymagania dotyczące filtrów na fs_fault. (a twój silnik SQL i tak to wszystko zmieni).
Edycja:oto SQLFiddle demonstrowanie filtrowania na podstawie klauzuli join kontra klauzuli where.