Как я могу применить фильтры Mutiple к моим таблицам SQL - PullRequest
0 голосов
/ 27 февраля 2019

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

| -------|----------------|-----------------|----------------|
|ID      |Question        |RespondentId     |Answer          |
| -------|----------------|-----------------|----------------|
|1       |Big             |1                |Yes             |
|2       |Big             |2                |Yes             |
|3       |Big             |3                |No              |
|4       |Gender          |1                |Male            |
|5       |Gender          |2                |Female          |
|6       |Gender          |3                |Female          |
|7       |Children        |1                |No              |
|8       |Children        |2                |Yes             |
|9       |Children        |3                |No              |
--------------------------------------------------------------

Мне нужны RespondenId s из этой таблицы с именем Ответы , которые соответствуют следующим фильтрам: Вопрос = Большой и Дети и Ответ = Да и Да соответственно для каждоговопрос.Поэтому, если бы у меня был правильный запрос Sql, мой результат должен вернуть мне следующий массив: [2] , поскольку единственная строка, в которой есть ответ Да на вопрос Большой и ответ Да на вопрос Дети - это тот, у кого RespondentId = 2.

Кроме того, вопросы и ответыпри условии не являются фиксированными и должны быть модульными.Например, я должен иметь возможность изменить ответ или удалить вопрос без необходимости изменять всю структуру моего запроса.

Не могли бы вы помочь мне найти правильный запрос для этой проблемы?Я искал множество объяснений, предоставленных @Erwin Brandstetter, но ни одно из них не соответствовало моим потребностям.

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Я думаю, что вы ищете, чтобы развернуть стол.Существуют разные синтаксисы для разных баз данных.Вы эффективно превращаете значения столбца «Вопрос» в собственные столбцы, а затем ищете строки, соответствующие вашим критериям.

Вот неэффективный пример в стандартном SQL, где я создаю одну таблицу для каждого вопроса и присоединяюсьих в одну таблицу с использованием RespondentId.

select respondent_id from (select * from answers where question = 'Big') as big join (select * from answers where question = 'Children') as children on big.respondent_id = children.respondent_id where big.answer = 'Yes' and children.answer = 'Yes';

0 голосов
/ 27 февраля 2019

Я бы сделал это следующим образом:

select a.RespondentId 
from Answers a
when (question, answer) in ( ('Big', 'Yes'), ('Children', 'Yes') )
group by RespondentId
having count(*) = 2 ;

Это легко обобщить так:

with qa as (
      select v.*
      from (values ('Big', 'Yes'), ('Children', 'Yes')
     ) v(question, answer)
select a.RespondentId 
from Answers a join
     qa
     on a.question = qa.question and a.answer = qa.answer
group by RespondentId
having count(*) = (select count(*) from qa);

Это довольно обобщенно.Вы могли бы даже организовать CTE для получения массива или аргумента json и разбора на отдельные значения сравнения.

0 голосов
/ 27 февраля 2019

Вы можете проверить результат, имеющий счетчик = 2 для строк, которые соответствуют вопросу и ответ, где условие

select RespondentId 
from Answers 
when question in ( 'Big', 'Children')
and Answer ='Yes' 
group by RespondentId having count(*) = 2 
...