合并两个表的SQL Server

问题描述 投票:0回答:2

我有两个桌子;

表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中的姓名属性是姓氏+名字的组合,而TotalDuration是学生参与的持续时间,以分钟为单位。

我想合并这两个表,以便它列出班级中的所有学生及其TotalDuration。我尝试了OUTER JOIN和UNION ALL,但无法弄清楚如何列出所有学生,但对于在特定日期未参加讲座的那些学生却显示NULL值。我该如何实现?

sql join group-by sum
2个回答
0
投票

您可能想通过StudentID汇总结果并使用LEFT JOIN,如下所示:

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

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


1
投票

您可以left joingroup by。但是由于您只需要一个汇总计算,所以相关子查询可能是一种更简单,更有效的方法(如果您有正确的索引,请参见下文):

select 
    t2.*,
    (
        select sum(totalduration) 
        from table1 t1 
        where t1.studentid = t2.studentid
    ) totalduration
from table2 t2

出于性能考虑,请考虑使用table1(studentid, totalduration)上的索引。

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

© www.soinside.com 2019 - 2024. All rights reserved.