Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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
SQL查询中的计数问题_Sql - Fatal编程技术网

SQL查询中的计数问题

SQL查询中的计数问题,sql,Sql,我想创建一个查询,显示员工的姓名和所有未关闭的服务的总和。查询结果没有给我正确的值 我的问题是: SELECT DISTINCT a.AssignedEmp, COUNT( a.TipoStatus ) AS 'Service Request Count' FROM Service a, employee b WHERE b.Classification_ClassificationID = 2 AND a.TipoSta

我想创建一个查询,显示员工的姓名和所有未关闭的服务的总和。查询结果没有给我正确的值

我的问题是:

SELECT DISTINCT 
       a.AssignedEmp, 
       COUNT( a.TipoStatus ) AS 'Service Request Count'
   FROM Service a, 
        employee b  
  WHERE b.Classification_ClassificationID = 2 
    AND a.TipoStatus = 'Open'
     OR a.TipoStatus = 'Pending'
     OR a.TipoStatus = 'Hold'
     OR a.TipoStatus = 'Warranty'
    AND a.AssignedEmp = b.UserName
 GROUP BY a.AssignedEmp
    LIMIT 0, 30
这个查询给我的结果是:

dpadil    16
epadil     8
正确的值应该是2和1。

您应该做的第一件事是去掉
计数和
分组依据

这将为您提供正在使用的实际行,并且可能会直接向您显示问题

比率是正确的(
16:8
=
2:1
)这一事实通常表明
和a.AssignedEmp=b.UserName
并不像您想象的那样具有限制性

换句话说,交叉表联接更为丰富。将行本身取出可以帮助您理解原因。

您应该做的第一件事是去掉
计数和
分组依据

这将为您提供正在使用的实际行,并且可能会直接向您显示问题

比率是正确的(
16:8
=
2:1
)这一事实通常表明
和a.AssignedEmp=b.UserName
并不像您想象的那样具有限制性


换句话说,交叉表联接更为丰富。把行本身拿出来应该有助于理解原因。

在OR'd条件周围需要括号(并且应该使用连接符号):

或者您可以直接以“未关闭”的形式写入条件:

SELECT DISTINCT 
       a.AssignedEmp, 
       COUNT( a.TipoStatus ) AS 'Service Request Count'
  FROM Service AS a
  JOIN employee AS b ON a.AssignedEmp = b.UserName
 WHERE b.Classification_ClassificationID = 2 
   AND a.TipoStatus != 'Closed'
 GROUP BY a.AssignedEmp
 LIMIT 0, 30

如最初所述,WHERE条款相当于:

WHERE (b.Classification_ClassificationID = 2 AND a.TipoStatus = 'Open')
   OR a.TipoStatus = 'Pending'
   OR a.TipoStatus = 'Hold'
   OR (a.TipoStatus = 'Warranty' AND a.AssignedEmp = b.UserName)

统计用户分类ID为2的所有未结服务项目;它还统计所有待定服务项目(不考虑分类ID),所有保留服务项目(不考虑分类ID),以及分配给用户的所有保修服务项目(不考虑分类ID)。GROUP BY过滤项目,以便仅统计具有正确分配员工的项目,但有些术语存在部分叉积,导致计数膨胀。

在OR'd条件周围需要括号(并应使用连接符号):

或者您可以直接以“未关闭”的形式写入条件:

SELECT DISTINCT 
       a.AssignedEmp, 
       COUNT( a.TipoStatus ) AS 'Service Request Count'
  FROM Service AS a
  JOIN employee AS b ON a.AssignedEmp = b.UserName
 WHERE b.Classification_ClassificationID = 2 
   AND a.TipoStatus != 'Closed'
 GROUP BY a.AssignedEmp
 LIMIT 0, 30

如最初所述,WHERE条款相当于:

WHERE (b.Classification_ClassificationID = 2 AND a.TipoStatus = 'Open')
   OR a.TipoStatus = 'Pending'
   OR a.TipoStatus = 'Hold'
   OR (a.TipoStatus = 'Warranty' AND a.AssignedEmp = b.UserName)

统计用户分类ID为2的所有未结服务项目;它还统计所有待定服务项目(不考虑分类ID),所有保留服务项目(不考虑分类ID),以及分配给用户的所有保修服务项目(不考虑分类ID)。GROUP BY过滤项目,以便仅统计具有正确分配员工的项目,但有些术语有部分叉积,导致计数膨胀。

您可能想更明确地构造条件

您还应该使用
JOIN
语句而不是附加条件来指定
JOIN
条件

SELECT DISTINCT         
a.AssignedEmp,         
COUNT( a.TipoStatus ) AS 'Service Request Count'    
FROM Service a
       INNER JOIN employee b
       ON a.AssignedEmp = b.UserName  
WHERE b.Classification_ClassificationID = 2      
    AND (
        a.TipoStatus = 'Open'      
        OR a.TipoStatus = 'Pending'      
        OR a.TipoStatus = 'Hold'      
        OR a.TipoStatus = 'Warranty'
        )
GROUP BY a.AssignedEmp     
    LIMIT 0, 30

您可能希望更明确地构造您的条件

您还应该使用
JOIN
语句而不是附加条件来指定
JOIN
条件

SELECT DISTINCT         
a.AssignedEmp,         
COUNT( a.TipoStatus ) AS 'Service Request Count'    
FROM Service a
       INNER JOIN employee b
       ON a.AssignedEmp = b.UserName  
WHERE b.Classification_ClassificationID = 2      
    AND (
        a.TipoStatus = 'Open'      
        OR a.TipoStatus = 'Pending'      
        OR a.TipoStatus = 'Hold'      
        OR a.TipoStatus = 'Warranty'
        )
GROUP BY a.AssignedEmp     
    LIMIT 0, 30

这是针对MySQL、SQLite还是PostgreSQL的?@OMG,您知道还有其他DBMS吗?:-)@paxdiablo:据我所知,只有三个支持
限制
。不要叫我“雪莉”:这是MySQL、SQLite或PostgreSQL的问题吗?@OMG,你知道还有其他DBMS吗?:-)@paxdiablo:据我所知,只有三个支持
限制
。别叫我“雪莉”:这太完美了!!谢谢乔纳森和所有帮助你的人!!这个很好用!!谢谢乔纳森和所有帮助你的人!!