SQL组通过包含空行

Mik*_*ron 6 sql sql-server group-by

为了这个问题,让我们假设这个表结构:

People:
PersonID int PK
Name varchar(50)
Place int NULL FK -> Places.PlaceID
MovedIn datetime

Places:
PlaceID int PK
Name varchar(50)
Run Code Online (Sandbox Code Playgroud)

我想确定每个地方住多少人:

SELECT pla.PlaceID, COUNT(*)
FROM Places AS pla
LEFT JOIN People as peo ON peo.PlaceID = pla.PlaceID
GROUP BY pla.PlaceID
Run Code Online (Sandbox Code Playgroud)

此查询将省略没有人居住的地方.有没有办法让它算0?

(我的目标是SQL Server 2005,重要的是它很重要)

编辑:在尝试调整Steve的解决方案后,这是我的真实(匿名)查询:

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
Run Code Online (Sandbox Code Playgroud)

(我最初的例子之间的翻译是:Foo - > People,FooType - > Places,FooConfig - >第三张表,为了更多的乐趣)我可以用Fosco的解决方案来完成这项工作,但我更喜欢Steve的.

Ste*_*yne 4

SELECT pla.PlaceID, COUNT(peo.PersonID)
FROM Places AS pla LEFT OUTER JOIN People as peo ON peo.PlaceID = pla.PlaceID
GROUP BY pla.PlaceID
Run Code Online (Sandbox Code Playgroud)

编辑问题:

假设总是有一个FooConfig条目,我们会将其删除LEFT JOIN到该表中(因为它总是在那里)。然后我们可以在表的连接中包含额外的条件Foo

SELECT
    ft.FooTypeID, COUNT(f.FooID)
FROM FooType as ft
  JOIN FooConfig fc ON ft.NotificationConfigID = fc.FooConfigID
  LEFT OUTER JOIN Foo f ON ft.FooTypeID = f.FooTypeID AND
    DateDiff(day, GetDate(), f.Date) > 0 AND
    DateDiff(day, GetDate(), f.Date) < fc.Days
GROUP BY ft.FooTypeID
Run Code Online (Sandbox Code Playgroud)

如果该FooConfig表是可选的,则不能使用额外的日期条件(因为它们总是评估为 false) - 所以我们必须执行以下操作:

SELECT
    ft.FooTypeID, COUNT(f.FooID)
FROM FooType as ft
  LEFT OUTER JOIN FooConfig fc ON ft.NotificationConfigID = fc.FooConfigID
  LEFT OUTER JOIN Foo f ON ft.FooTypeID = f.FooTypeID AND
    (
      (DateDiff(day, GetDate(), f.Date) > 0 AND
       DateDiff(day, GetDate(), f.Date) < fc.Days) 
      OR
      (fc.Days IS NULL)
    )
GROUP BY ft.FooTypeID
Run Code Online (Sandbox Code Playgroud)