For the sake of this question, let's suppose this table structure:
People: PersonID int PK Name varchar(50) Place int NULL FK -> Places.PlaceID MovedIn datetime Places: PlaceID int PK Name varchar(50) I want to determine how many people live at each place:
SELECT pla.PlaceID, COUNT(*) FROM Places AS pla LEFT JOIN People as peo ON peo.PlaceID = pla.PlaceID GROUP BY pla.PlaceID This query will omit places that have no people living there. Is there any way to make it count 0 instead?
(I'm targetting SQL Server 2005, in the off chance that it matters)
EDIT: Here's my real (anonymized) query, after trying to adapt Steve's solution:
SELECT ft.FooTypeID, COUNT(f.FooID) FROM FooType as ft LEFT OUTER JOIN Foo f ON ft.FooTypeID = f.FooTypeID LEFT JOIN FooConfig fc ON ft.NotificationConfigID = fc.FooConfigID WHERE DateDiff(day, GetDate(), f.Date) > 0 AND DateDiff(day, GetDate(), f.Date) < fc.Days GROUP BY ft.FooTypeID (The translation between my initial example and this is: Foo -> People, FooType -> Places, FooConfig -> A third table, for extra fun) I can make this work with Fosco's solution, but I'd prefer Steve's.
FooConfigtable? It looks like you're doing nothing with it.fc.Days, used in theWHEREclauses.FooTypeIDis supposed to bef.FooTypeID, and thatstis supposed to beft? Is FooType -> FooConfig a 1:0-1, or a 1:m?