SQL Server 2005 - как сравнить значение поля и вернуть счетчик, если он различен, для каждого случая - PullRequest
3 голосов
/ 31 мая 2011
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), COURSE VARCHAR(8), SCHOOL VARCHAR(2))
INSERT INTO @OTHERSCHOOLS VALUES ('10000000','MCR1010','11')
INSERT INTO @OTHERSCHOOLS VALUES ('10000000','MCR1011','14')
INSERT INTO @OTHERSCHOOLS VALUES ('10000000','MCR1012','15')
INSERT INTO @OTHERSCHOOLS VALUES ('12000000','MCR6080','19')
INSERT INTO @OTHERSCHOOLS VALUES ('13000000','MCR6090','15')

Для приведенных выше образцов данных. Два стола. Школа и другие школы.

Currentschool - текущий курс, на котором учится студент, включая школьный код, и является основной таблицей.

OtherSchools - это потенциально другие курсы, которые могут посещать учащиеся в разных школах.

Мне нужно сравнить таблицу текущих школ с таблицей других школ, сопоставленной с использованием идентификационного номера учащегося, и для каждого другого кода школы в других школах необходимо вернуть счет.

например:

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)

Возможно ли это?

Большое спасибо

М.

Ответы [ 2 ]

3 голосов
/ 31 мая 2011
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 ()?

3 голосов
/ 31 мая 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...