2012-05-04 43 views
2

这是我在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中产生错误。

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

回答

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

+0

感谢您的答复! – Burzum619

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

+0

不返回连接没有行的行。那么我想OP会希望计数为0。 – usr

+0

@usr我们可以猜出所有我们喜欢的,他们可以说。如果他们不关心没有迟到时间表的人(我不明白他们为什么会这样做),那么这应该做他们需要的一切。 –

+0

我尝试了一个类似于Anthony发布的查询,并且似乎在吐出一些好看的数据。我想我应该回顾一下GROUP BY命令实际做了什么,但看起来这是我正在寻找的答案。 “usr”,你能澄清你的意思吗? – Burzum619

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 
+0

这适用于计算一个表,但如果要执行多个连接和多个子计数,则不构成。它的工作更是巧合。 – usr

+0

@usr - 它的工作原理并不是巧合。它给出了问题的参数。这可以通过简单地使用Count(Distinct(...)来处理多个连接,在这个问题中,我们只会被告知两个表格,如果有20个表格,那么会引出一个不同的解决方案,方法)需要改变。 – Thomas