Объединение 3 таблиц, чтобы получить детали из опроса - PullRequest
0 голосов
/ 30 января 2020

Я взял опрос, в котором есть несколько полей, которые нужно выбрать. Пример: рабочее место, годы опыта и уровень удовлетворенности.

tlDetail
SurveyId QuestionId ChoiceId 
1          1           1
1          2           5
1          3           7
2          1           3
2          2           6
2          3           8

tblquestion
QuestionId Question
1           Question 1
2           Question 2
3           Question 3

TblChoice
ChoiceId QuestionId ChoiceName
1          1          HR
2          1          Accountant
3          1          Teacher
4          2          >10 years
5          2          <10 years
6          2          =10 years
7          3          satisfies
8          3          not satisfied
9          3          no comment

Мне нужно написать запрос, который скажет мне, сколько учителей = 10 лет и удовлетворены

1 Ответ

0 голосов
/ 30 января 2020

Вы можете использовать два уровня агрегации:

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