Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将0替换为无结果的SQL语句_Sql - Fatal编程技术网

将0替换为无结果的SQL语句

将0替换为无结果的SQL语句,sql,Sql,从SQL语句中获取所需结果时遇到问题。我知道我可能错过了一些简单的东西,但我就是看不到 这是我的桌子。 Table: Users (RoleID is linked to ID in Roles Table) ID, FirstName, LastName, RoleID 1, Matt, Ryan, 1 2, Chipper, Jones, 1 3, Julio, Jones, 2 4, J

从SQL语句中获取所需结果时遇到问题。我知道我可能错过了一些简单的东西,但我就是看不到

这是我的桌子。

Table: Users (RoleID is linked to ID in Roles Table) ID, FirstName, LastName, RoleID 1, Matt, Ryan, 1 2, Chipper, Jones, 1 3, Julio, Jones, 2 4, Jason, Bourn, 3 Table: Roles ID, Name 1, Field Rep 2, Tech 3, Admin Table: FRrequests (UserID is linked to ID in Users table) ID, UserID, Status 1, 1, Open 2, 1, Submitted 3, 1, Delayed 4, 1, Complete 表:用户(RoleID链接到角色表中的ID) ID、名字、姓氏、RoleID 1号,马特,瑞安,1号 2,奇珀,琼斯,1 朱利奥,琼斯,2 杰森,伯恩,3岁 表:角色 身份证,姓名 1、现场代表 2、技术 3、管理 表:FRrequests(UserID链接到Users表中的ID) 用户ID,用户ID,状态 1,1,打开 2、1、提交 3,1,延迟 4,1,完成 我想要的是一个SQL语句,它向我显示所有Field Rep的所有“已提交”和“延迟”请求的计数。下面是期望结果的示例

Name Count Chipper Jones 0 Matt Ryan 2 姓名计数 奇珀琼斯0 马特·瑞安2 这是我到目前为止的陈述和它给我的结果

SELECT Users.FirstName + ' ' + Users.LastName AS Name, COUNT(FRrequests.ID) AS 'Open Requests' FROM Users INNER JOIN Roles 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 Name Count Matt Ryan 2 选择Users.FirstName+“”+Users.LastName作为名称,计数(FRrequests.ID)作为“打开的请求” 从用户内部加入 Users.RoleID=Roles.ID左外部联接上的角色 FRrequests ON Users.ID=FRrequests.UserID 其中(Roles.Name=N'Field Rep')和(FRrequests.Status='Submitted'或FRrequests.Status='Delayed') 按Users.FirstName、Users.LastName分组 姓名计数 马特·瑞安2
我知道“AND(FRrequests.Status='Submitted'或FRrequests.Status='Delayed')”部分会破坏它。如果我在语句中没有这个选项的情况下运行它,我会得到所有的用户,但它会计算所有的状态,而不仅仅是提交和延迟。我只是不知道我错过了什么才能让它发挥作用。任何帮助都将不胜感激。

您非常接近,请尝试以下方法:

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

如果希望包括没有请求的现场代表,则需要为每个现场代表指定一行。因此,需要沿以下直线使用左外连接:

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


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

这非常有效。感谢您的帮助,响应速度真快。:)