Вы можете использовать два уровня агрегации:
select count(*)
from (
select 1 x
from tlDetail d
inner join tblChoice c
on c.QuestionId = d.QuestionId
and c.ChoiceId = d.ChoiceId
group by survey_id
having
max(case when c.ChoiceName = 'Teacher' then 1 end) = 1
and max(case when c.ChoiceName = '=10 years' then 1 end) = 1
) t
Обратите внимание, что это предполагает, что два разных вопроса никогда не будут иметь одинаковые ChoiceName
, что хорошо для ваших выборочных данных, но не обязательно так в случае реальный мир. Если вы хотите что-то более точное, вам нужно определить, на какой вопрос вы ожидаете получить ответ 'Teacher'
или '=10 years'
, например что-то вроде:
select count(*)
from (
select 1 x
from tlDetail d
inner join tblChoice c
on c.QuestionId = d.QuestionId
and c.ChoiceId = d.ChoiceId
inner join tblQuestion q
on q.QuestionId = d.QuestionId
group by survey_id
having
max(case
when q.Question = 'Question 1' and c.ChoiceName = 'Teacher'
then 1
end) = 1
and max(case
when q.Question = 'Question 2' and c.ChoiceName = '=10 years'
then 1
end) = 1
) t