如何在SQL Server中组合两个表

如何在SQL Server中组合两个表,sql,join,group-by,sum,Sql,Join,Group By,Sum,我有两张桌子: 表1 Date Name StudentID TotalDuration ------------------------------------------------------------ 2019-09-30 aA 11111 100 2019-09-30 bB 22222 40 2019-09-30 cC

我有两张桌子:

表1

Date          Name         StudentID          TotalDuration
------------------------------------------------------------
2019-09-30    aA           11111              100
2019-09-30    bB           22222              40
2019-09-30    cC           33333              60
2019-10-07    aA           11111              50
2019-10-07    bB           22222              10
2019-10-07    cC           33333              12
2019-10-07    dD           44444              90

它包含参加讲座的学生的数据(因此,不包括未参加的学生)

表2

StudentID          Surname         FirstName          Group
------------------------------------------------------------
11111              A               a                  1
22222              B               b                  1
33333              C               c                  1
44444              D               d                  2
55555              E               e                  2
66666              F               f                  2
77777              G               g                  3
表2包含了班上所有学生的数据

表1中的Name属性是姓氏+名字的组合,TotalDuration是以分钟为单位的学生参与持续时间

我想把这两个表合并起来,这样它就列出了班上所有的学生和他们的总时长

我尝试了
OUTER-JOIN
UNION-ALL
,但不知道如何列出所有学生,但对那些在特定日期没有参加讲座的学生显示空值


如何实现这一点?

您可以
左连接
分组方式
。但是,由于您只需要一次聚合计算,相关子查询可能是一种更简单、更有效的方法(如果您有正确的索引,请参见下文):

关于性能,考虑一个索引:<代码>表1(StuttRead,ToalSimulink)


旁注:从数据库设计的角度来看,
table1
中的
Name
列是不需要的;这是大量的信息,会使维护任务复杂化(如果有人更改另一个表中studend的名字怎么办?)。您应该删除该列,并仅依赖于
studentid
上的外键。

您可能希望通过
studentid
聚合结果,并使用
左联接,如所示:

select
  a.StudentId,
  a.FirstName,
  a.Surname,
  a.Group,
  sum(b.TotalDuration) as total_duration
from table2 a
left join table1 b on b.StudentId = a.StudentId
group by a.StudentId

请注意,按
a.FirstName
a.lasname
分组(假设
StudentId
是主键)根据SQL标准,是可选的。不过,我不确定SQL server是否需要它。

请用您正在使用的数据库标记您的问题:mysql、oracle、postgresql…?Condition
vlecattendence.LecDate=@Date
应该放在
LEFT JOIN
ON
子句中,而不是放在
FROM>中
子句。但请注意,将您的问题改为后续问题来询问答案是违反Stack Overflow的指导原则的。相反,您应该接受对您帮助最大的答案,并对任何您认为有用的答案进行投票。如果您还有其他问题,那么您应该这样做。谢谢您提供的有用信息。我是Stack over的新手flow,但没有意识到这违反了指导原则。我会记得从现在起(我不确定现在是否应该重新编辑)没有问题。我将您的问题回滚到了以前的版本。请在代码问题中给出一个--cut&paste&runnable代码,包括作为代码的最小代表性示例输入;期望和实际输出(包括逐字的错误消息);标记和版本;明确的规范和解释。提供最少的代码,说明显示的代码是正确的,扩展为显示的代码是不正确的。(调试基础。)对于包含DBMS和DDL(包括约束和索引)的SQL输入格式为表格的代码(&I)。]搁置您的总体目标,将代码切掉到第一个表达式,不要给出您期望的内容,说出您期望的内容以及原因。这是一个很好的见解。我只是将名称列用作一个易于使用和阅读的输入值。
select
  a.StudentId,
  a.FirstName,
  a.Surname,
  a.Group,
  sum(b.TotalDuration) as total_duration
from table2 a
left join table1 b on b.StudentId = a.StudentId
group by a.StudentId