4

我在从我的 SQL 语句中获取我想要的结果时遇到问题。我知道我可能遗漏了一些简单的东西,但我就是看不到它。

这是我的桌子。

表:用户 (RoleID 与 Roles 表中的 ID 相关联)
IDFirstNameLastNameRoleID 
1,马特,瑞恩,1
2、奇普、琼斯、1
3,胡里奥,琼斯,2
4、杰森、伯恩、3

表:角色
ID名称
1、现场代表
2、科技
3、管理员

表:FRrequests  (UserID 与 Users 表中的 ID 相关联) 
IDUserIDStatus
1, 1, 打开
2, 1, 提交
3, 1, 延迟
4, 1, 完成

我想要的是一条 SQL 语句,它向我显示所有现场代表的所有“提交”和“延迟”请求的计数。下面是所需结果的示例。

名称             计数
奇珀·琼斯 0
马特·瑞恩 2

这是我到目前为止的声明以及它给我的结果。

SELECT Users.FirstName + ' ' + Users.LastName AS Name, COUNT(FRrequests.ID) AS 'Open Requests'
FROM 用户 INNER JOIN
          角色 ON Users.RoleID = Roles.ID LEFT OUTER JOIN
          FRrequests ON Users.ID = FRrequests.UserID
WHERE (Roles.Name = N'Field Rep') AND (FRrequests.Status = 'Submitted' OR FRrequests.Status = 'Delayed')
GROUP BY Users.FirstName, Users.LastName

名称             计数
马特·瑞恩 2

我知道“AND(FRrequests.Status = 'Submitted' OR FRrequests.Status = 'Delayed')”部分是破坏它的原因。如果我在语句中不使用它运行它,我会得到所有用户,但它会计算所有状态,而不仅仅是提交和延迟。我只是无法弄清楚我缺少什么才能让它工作。任何帮助将不胜感激。

4

2 回答 2

1

您真的很接近,请尝试以下操作:

SELECT U.FirstName + ' ' + U.LastName AS Name, COUNT(F.ID) AS 'Open Requests'
FROM Users U
INNER JOIN Roles R
    ON U.RoleID = R.ID 
LEFT JOIN ( SELECT * FROM FRrequests 
            WHERE Status IN ('Submitted','Delayed')) F
    ON U.ID = F.UserID
WHERE R.Name = N'Field Rep' 
GROUP BY U.FirstName, U.LastName
于 2012-11-07T21:18:22.643 回答
0

如果您希望包含没有请求的现场代表,则需要为每个现场代表设置一行。因此,您需要按照以下几行使用左外连接:

SELECT 
    u.FirstName || ' ' || u.LastName as Name 
    , COALESCE(frr.Counter,0) as Count 
FROM 
    Users u 
    LEFT OUTER JOIN ( 
        SELECT 
            UserID 
            ,count(*) as Counter 
        FROM 
            FRrequests 
        WHERE 
            Status IN ('Submitted', 'Delayed') 
        GROUP BY
            UserID
    ) frr ON frr.UserID = u.ID 
    , Roles r 
WHERE 
    u.ID = f.UserID 
    AND u.RoleID = r.ID 
    AND r.Name = 'Field Rep' 
;

左外连接将仅在发生匹配时提供连接,因此它不会从自然连接集中删除行。在这种情况下,您将获得所有现场代表用户的列表,以及他们的 FR 请求计数,如果有的话,状态为“已提交”或“延迟”。

COALESCE 用于(至少在 Postgresql 中)检查空值,然后将其强制为提供的值,在本例中为 0。因此,如果出现 NULL 值(例如,因为没有从左外连接)它被 0 替换。

于 2012-11-07T21:29:10.300 回答