3

这是我在 Stack Overflow 上的第一篇文章,我有一个相对简单的初学者 SQL 问题。我的任务是在我们的数据库中查找每个员工延迟提交时间表的次数。我主要查看了两张表,但我无法将这两张表放在一起,并且无法很好地查看发生次数和与之关联的员工 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 中产生了错误。

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

4

3 回答 3

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
于 2012-05-05T00:02:30.763 回答
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为实际在表中的列的名称即可。

于 2012-05-04T22:47:02.397 回答
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。

于 2012-05-04T22:46:41.513 回答