计算子查询中出现的次数

时间:2012-05-04 22:41:47

标签: sql sql-server-2008

这是我在Stack Overflow上的第一篇文章,我有一个相对简单的初学SQL问题。 我的任务是查找数据库中每个员工提交的延迟时间表的次数。我主要关注的是两个表,但是我很难将这两个表放在一起,并且能够找到COUNT的出现以及与之关联的员工ID。

我创建了这个查询,为每次出现提供了EmployeeID

SELECT db.Employee.EmployeeID 
FROM db.LateTimesheets
INNER JOIN db.Employee ON Employee.LastName = LateTimesheets.LastName AND Employee.FirstName = Late Timesheets.FirstName

现在,通过这个简单的查询,我可以看到EmployeeID重复,但这些事件多次发生。但是,我最终想要得到的是一个表格,它显示每次出现的计数,以及与此计数相关联的EmployeeID

我认为我需要使用COUNT()函数来计算每个EmployeeID的行数,然后选择该值以及EmployeeID。但是,我在正确构造子查询时遇到了麻烦,到目前为止我尝试的所有内容都只会在MS SQL Server Management Studio中生成错误。

任何帮助将不胜感激。先谢谢!

3 个答案:

答案 0 :(得分:2)

usr的答案的更简单版本将是以下内容,它避免了派生表的构造:

Select db.Employee.EmployeeID, Count( db.LateTimesheets.somecolumn ) As Total
From db.Employee 
    Left Join db.LateTimesheets
        On LateTimesheets.LastName  = Employee.LastName
            And Late Timesheets.FirstName = Employee.FirstName
Group By db.Employee.EmployeeID

答案 1 :(得分:1)

我可能误解了这个问题,但不会GROUP BY解决你的问题?

SELECT COUNT(db.LateTimesheets.somecolumn), db.Employee.EmployeeID 
FROM db.LateTimesheets
INNER JOIN db.Employee ON Employee.LastName = LateTimesheets.LastName 
    AND Employee.FirstName = Late Timesheets.FirstName
GROUP BY db.Employee.EmployeeID

只需将somecolumn替换为表中实际列的名称。

答案 2 :(得分:0)

select e.*, isnull(lt.Count, 0) as Count
from Employee e
left join (
 select LastName, count(*) as Count from LateTimesheets
) LateTimesheets lt on e.LastName = lt.LastName

诀窍是在派生表中进行分组。您不希望将所有内容分组,只需对LateTimesheets进行分组。

我们需要一个左连接来让员工没有LateTimesheets。