Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 正在计算子查询中出现的次数_Sql_Sql Server 2008 - Fatal编程技术网

Sql 正在计算子查询中出现的次数

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

这是我关于堆栈溢出的第一篇文章,我有一个相对简单的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
一起选择。但是,我在正确构造子查询时遇到了问题,到目前为止,我尝试的所有方法都只在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个表,则会产生不同的解决方案,因此此方法(以及您的方法)需要更改。