如何在SQL Server中组合两个表
我有两张桌子: 表1如何在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
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…?Conditionvlecattendence.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