Sql 正在计算子查询中出现的次数
这是我关于堆栈溢出的第一篇文章,我有一个相对简单的SQL初学者问题。 我的任务是在我们的数据库中查找每个员工延迟提交时间表的次数。有两个表我一直在看,但我很难把这两个表放在一起,对发生次数和与之相关的员工ID给出一个合理的看法 我创建了这个查询,为每次事件提供Sql 正在计算子查询中出现的次数,sql,sql-server-2008,Sql,Sql Server 2008,这是我关于堆栈溢出的第一篇文章,我有一个相对简单的SQL初学者问题。 我的任务是在我们的数据库中查找每个员工延迟提交时间表的次数。有两个表我一直在看,但我很难把这两个表放在一起,对发生次数和与之相关的员工ID给出一个合理的看法 我创建了这个查询,为每次事件提供EmployeeID SELECT db.Employee.EmployeeID FROM db.LateTimesheets INNER JOIN db.Employee ON Employee.LastName = LateTimes
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
一起选择。但是,我在正确构造子查询时遇到了问题,到目前为止,我尝试的所有方法都只在MSSQLServerManagementStudio中产生了错误
任何帮助都将不胜感激。提前感谢
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
诀窍是在派生表中进行分组。你不想把所有事情都分组,只想把迟到的时间表分组
我们需要一个左连接,以使员工仍然没有迟到的时间表。我可能误解了这个问题,但是
分组方式是否能解决您的问题
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
替换为表中实际列的名称。更简单的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
不返回联接没有行的行。我猜OP希望计数为0。@usr我们可以根据自己的喜好猜测,由他们自己说。如果他们不关心那些没有迟到时间表的人(我不明白他们为什么会这么做),那么这应该是他们所需要的一切。我尝试了一个类似于Anthony发布的查询,它似乎给出了一些好看的数据。我想我应该回顾一下GROUP BY command的实际功能,但看起来这正是我想要的答案。“usr”,你能澄清你的意思吗?我明白你们在说什么。由于这个功能稍后将被组合起来实现一个管理跟踪工具,我可能需要考虑那些没有延迟提交的EmployeeID。有没有一种简单的方法可以通过修改我当前的查询来做到这一点?@Burzum619如果您需要一份所有员工的列表,没有迟到时间表的员工的计数为0,那么usr的答案应该可以做到这一点。虽然就我个人而言,我看不出提供这些信息有什么实际用途。这对一个表有效,但如果要进行多个联接和多个子计数,则不能组合。它的工作更多的是巧合。@usr-它的工作不是巧合。它在给定问题参数的情况下工作。这可以通过简单地使用Count(Distinct(…
)来处理多个联接。在这个问题中,我们只被告知有两个表。如果有20个表,则会产生不同的解决方案,因此此方法(以及您的方法)需要更改。