Jeg giver mit svar, fordi jeg er meget i tvivl om de andre svar. Du skal være forsigtig med filterkravene. Husk, hvor-sætningen kører efter dine joins . Så hvis der er filterkrav i where-klausulen der refererer til den ikke-ydre sammenføjede tabel, har du (i mange tilfælde) annulleret din ydre joinforbindelse. Så tager du din sql, ser det ud til, at den enkleste løsning er enten at bruge den korrekte join eller at flytte tabelnavnene på passende vis, og derefter flytte filterbetingelserne ud af where-sætningen og ind i join-klausulen.
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
En anden måde, som jeg mener burde være ækvivalent, er
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
Da det ikke er helt ligegyldigt, hvor filterkravene på fs_fault er. (og din SQL-motor vil ændre det hele alligevel).
Rediger:Her er en SQLFiddle demonstrerer filtrering på join-klausulen vs. where-klausulen.