Вопрос SQL вопрос Извлечение данных выполнено для одного из двух условий, но не для обоих - PullRequest
0 голосов
/ 09 апреля 2019

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

Куда я иду не так?

Я пробовал разные операторы OR и AND NOT, но не могу получить нужный результат

use coll18_live

select ENR_STUDENT_ID, ENR_TERM, CRS_NAME, ENR_GRADE
from dbo.CA320_ENROLLMENT_VIEW_N03
WHERE ENR_CENSUS_REG_FLAG = 'Y'
and ENR_TERM in ('14/FA', '15/SP')
and not (CRS_NAME = 'BUSI-105' and CRS_NAME = 'ENGL-120')
and CRS_NAME in ('ACCT-120', 'ACCT-125', 'BUSI-100', 'BUSI-103', 'BUSI-105', 'ENGL-120') 

Я ожидаю, что на выходе будут показаны студенты, которые закончили ACCT-120, ACCT-12, BUSI-100, BUSI-103 и BUSI-105 или ENGL-120 (но не оба BUSI-105 или ENGL-120)

1 Ответ

0 голосов
/ 09 апреля 2019

Я думаю, вы хотите агрегировать с предложением having.Вы не можете сделать это с WHERE, потому что информация, которую вы хотите (очевидно) находится в разных строках:

select ENR_STUDENT_ID
from dbo.CA320_ENROLLMENT_VIEW_N03
where ENR_CENSUS_REG_FLAG = 'Y' AND
      ENR_TERM in ('14/FA', '15/SP')
group by ENR_STUDENT_ID
having sum(case when CRS_NAME in ('ACCT-120', 'ACCT-125', 'BUSI-100', 'BUSI-103') then 1 else 0 end) = 4 and
       sum(case when CRS_NAME in ('BUSI-105', 'ENGL-120') then 1 else 0 end) > 0;
...