子查询中计算出现次数

3
我的任务是查找我们数据库中每个员工的延迟提交时间表的出现次数。我主要查看了两个表,但我无法将它们结合起来,并想出一个不错的视图来显示与之相关的出现次数和员工ID。
我创建了这个查询,它为每个出现次数提供了EmployeeID。
SELECT db.Employee.EmployeeID 
FROM db.LateTimesheets
INNER JOIN db.Employee ON Employee.LastName = LateTimesheets.LastName AND Employee.FirstName = Late Timesheets.FirstName

现在,通过这个简单的查询,我可以看到每个员工ID重复出现的次数。然而,最终我想得到的是一个表格,它显示每个员工ID的计数以及与之关联的员工ID。
我认为我需要使用COUNT()函数来计算每个员工ID的行数,然后选择该值和员工ID。但是,我在正确构造子查询方面遇到了麻烦,迄今为止我尝试的所有方法都只在MS SQL Server Management Studio中生成错误。
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

这个方法可以用于计算一个表格,但如果你想要进行多个连接和多个子计数,则无法组合。它更像是一种巧合,能够正常工作。 - usr
@usr - 它能够工作并非巧合,而是在给定问题参数的情况下能够正常运行。只需使用“Count(Distinct(...”即可实现多个连接。在这个问题中,我们只知道两个表格。如果有20个表格,那么就需要不同的解决方案,因此这种方法(以及您的方法)需要进行更改。 - Thomas

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替换为实际在表中存在的列名即可。


1
不返回连接没有行的行。我猜OP想要一个计数为0。 - usr
@usr 我们可以猜测,但最终决定权在他们手中。如果他们不关心那些没有提交时间表的人(我也不知道为什么他们会关心),那么这应该能满足他们的所有需求。 - Anthony Grist
我尝试了类似于Anthony发布的查询,它似乎输出了一些好看的数据。我认为我应该去复习一下GROUP BY命令实际上是做什么的,但看起来这就是我要找的答案。 "usr",你能澄清一下你的意思吗? - Burzum619
我明白你们的意思。由于这个功能将来会被整合到实现管理跟踪工具中,我可能需要考虑那些没有迟交记录的员工ID。是否有一种简单的方法可以通过修改我的当前查询来实现这一点? - Burzum619
如果您需要一个包含所有员工的列表,并且对于那些没有迟到时间表的员工,计数为0,则usr的答案应该可以做到这一点。尽管个人认为提供这些信息没有任何实际用途。 - Anthony Grist

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的员工。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接