SQL Server 2005-如何比较字段值,并在每次出现时返回计数如果不同

问题描述

||
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
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...