【发布时间】:2013-09-21 03:52:36
【问题描述】:
我有几个不同的 SQL 表需要执行一些计数。这是为了我的工作,所以显然数据是机密的,但我会尝试将其抽象为类似的东西。想象一下大学注册办公室...
我们的第一个表格包含学生已完成的所有课程的列表。
表:student_courses
student_id | course_id
----------------------
123456 | MATH101
123456 | MATH203
785426 | PHYS305
... | ...
我们还为我们大学的不同部门提供表格,列出(除其他外)课程 ID 和课程年级:
表:math_courses
course_id | year
--------------------
MATH101 | 1
MATH201 | 2
MATH202 | 2
CALC103 | 1
STAT402 | 4
... | ...
想象一下类似的science_courses 和general_courses 表。该大学还有其他部门,但我们目前只考虑这三个。
我们正在寻找的是达到每个年级/部门组合的学生人数。
例如,如果学生同时参加了 MATH101 和 MATH201,则其数学系的“年”将被视为“2”。
并非所有学生都完成了所有系的课程,也并非所有学生都必须修读这三个系的任何课程。
基本上,我希望生成下表:
max_math_year | max_science_year | max_general_year | student_count
---------------------------------------------------------------------
NULL | NULL | NULL | 39847
NULL | NULL | 1 | 172
NULL | NULL | 2 | 0
... | ... | ... | ...
4 | 4 | 4 | 4986
我已经建立了一个临时表来存储每个学生的最高级别,并且它似乎工作正常,所以为了这个练习,假设我们有下表:
表:#student_maximums
student_id | max_math_year | max_science_year | max_general_year
----------------------------------------------------------------
123465 | 2 | NULL | 1
782514 | 3 | 1 | NULL
874252 | NULL | NULL | NULL
... | ... | ... | ...
当一行没有符合特定组合的学生时,我想返回0,但如果我对上表进行计数,它不会返回零值。
大多数情况下,我会使用LEFT OUTER JOIN 来包含零,但在这种情况下,我们会根据最初来自四个不同表的数据进行计数。我考虑过使用CROSS JOIN,但这不会在行中包含NULL 值,这也是我需要的。
谢谢!
【问题讨论】:
标签: sql sql-server database join null