2

我很抱歉,因为我知道这种类型的问题已经被问了很多次,但是我看到的帖子似乎不太适合我想要做的事情或有所作为,这是一个简单的解决方案,因为我有一个存储表类型 ID 和保存日期,然后是另一个具有该类型 ID 和类型名称的表。

我想要的是它会在设定的日期范围内显示所有保存的类型,但显示 0 计数而不是根本不显示的类型。如果我将查询仅作为计数运行,它完全符合我的要求

SELECT     dbo.RequestType.Type, COUNT(dbo.Requests.RequestType) AS Count
FROM         dbo.RequestType LEFT OUTER JOIN
                      dbo.Requests ON dbo.RequestType.TypeID = dbo.Requests.RequestType
GROUP BY dbo.RequestType.Type

但是,如果我这样设置日期范围:

SELECT     dbo.RequestType.Type, COUNT(dbo.Requests.RequestType) AS Count
FROM         dbo.RequestType LEFT OUTER JOIN
                      dbo.Requests ON dbo.RequestType.TypeID = dbo.Requests.RequestType
WHERE     (dbo.Requests.DateSaved BETWEEN CONVERT(DATETIME, '2013-01-01 00:00:00', 102) AND CONVERT(DATETIME, '2013-03-30 00:00:00', 102))
GROUP BY dbo.RequestType.Type

然后不显示任何0计数?

谢谢

4

2 回答 2

2

错误是WHERE子句中的任何内容都将根据记录进行检查,因此,如果它引用左外连接右侧的表,则会撤消连接的外部性。只需将该子句移入.ON

SELECT     dbo.RequestType.Type, 
  COUNT(dbo.Requests.RequestType) AS Count
FROM dbo.RequestType 
LEFT OUTER JOIN dbo.Requests 
ON dbo.RequestType.TypeID = dbo.Requests.RequestType
  AND     (dbo.Requests.DateSaved 
    BETWEEN CONVERT(DATETIME, '2013-01-01 00:00:00', 102)
    AND CONVERT(DATETIME, '2013-03-30 00:00:00', 102))
GROUP BY dbo.RequestType.Type
于 2013-06-05T23:19:36.153 回答
1

首先获取不同请求类型的列表,然后再加入。

WITH D AS (
    SELECT DISTINCT dbo.RequestType.Type
    FROM dbo.RequestType
)
SELECT     D.Type, COALESCE(COUNT(dbo.Requests.RequestType),0) AS Count
FROM D 
    LEFT OUTER JOIN dbo.RequestType ON D.Type=dbo.RequestType.Type
    LEFT OUTER JOIN dbo.Requests ON dbo.RequestType.TypeID = dbo.Requests.RequestType AND (dbo.Requests.DateSaved BETWEEN CONVERT(DATETIME, '2013-01-01 00:00:00', 102) AND CONVERT(DATETIME, '2013-03-30 00:00:00', 102))
GROUP BY dbo.RequestType.Type
于 2013-06-05T23:03:49.470 回答