这是我在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中生成错误。
任何帮助将不胜感激。先谢谢!
答案 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。