问题描述
||
DECLARE @CURRENTSCHOOL TABLE (STUDENT VARCHAR(8),COURSE VARCHAR(8),SCHOOL VARCHAR(2))
INSERT INTO @CURRENTSCHOOL VALUES (\'10000000\',\'MCR1010\',\'11\')
INSERT INTO @CURRENTSCHOOL VALUES (\'12000000\',\'MCR6080\',\'11\')
INSERT INTO @CURRENTSCHOOL VALUES (\'13000000\',\'MCR6090\',\'15\')
DECLARE @OTHERSCHOOLS TABLE (STUDENT VARCHAR(8),SCHOOL VARCHAR(2))
INSERT INTO @OTHERSCHOOLS VALUES (\'10000000\',\'11\')
INSERT INTO @OTHERSCHOOLS VALUES (\'10000000\',\'MCR1011\',\'14\')
INSERT INTO @OTHERSCHOOLS VALUES (\'10000000\',\'MCR1012\',\'15\')
INSERT INTO @OTHERSCHOOLS VALUES (\'12000000\',\'19\')
INSERT INTO @OTHERSCHOOLS VALUES (\'13000000\',\'15\')
对于以上示例数据。两张桌子。当前学校和其他学校。
当前学校是学生正在学习的当前课程,包括学校代码,
并且是主表。
其他学校可能是学生可以在其他学校继续学习的其他课程。
我需要将当前学校表与使用学生ID编号匹配的其他学校表进行比较,并且对于其他学校中的每个不同学校代码,都需要返回一个计数。
例如:
Student: OtherSchoolCount:
10000000 2 (because of 2 different school codes than than the current school)
12000000 1 (because of 1 different school code than than the current school)
13000000 blank (because not a different school code)
这可能吗?
非常感谢
M.
解决方法
SELECT cs.student,COUNT(os.course)
FROM @CURRENTSCHOOL cs
LEFT JOIN @OTHERSCHOOLS os
ON cs.student = os.student
AND cs.school <> os.school
GROUP BY cs.student
输出
STUDENT
-------- -----------
10000000 2
12000000 1
13000000 0
如果Null比零更可取,那么您可以执行此操作(或使用等效的CTE)
SELECT student,CASE
WHEN coursecount = 0 THEN NULL
ELSE coursecount
END coursecount
FROM (SELECT cs.student,COUNT(os.course) coursecount
FROM @CURRENTSCHOOL cs
LEFT JOIN @OTHERSCHOOLS os
ON cs.student = os.student
AND cs.school <> os.school
GROUP BY cs.student) t
哪个输出
student courseCount
-------- -----------
10000000 2
12000000 1
13000000 NULL
更新:NullIF可以用作Case语句的替代方法,请参阅NULLIF()有哪些应用程序?
, select o.Student,count(*) as Count
from CURRENTSCHOOL c1
inner join OTHERSCHOOLS o on c1.Student = o.Student --this join is to ensure student exists in both tables
left outer join CURRENTSCHOOL c on o.Student = c.Student
and o.School= c.School
where c.Student is null
group by o.Student