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:据我所知,只有三个支持限制。别叫我“雪莉”:这太完美了!!谢谢乔纳森和所有帮助你的人!!这个很好用!!谢谢乔纳森和所有帮助你的人!!