如何在我的 sql 表上应用多个过滤器
How can I apply mutliple filters on my sql tables
我正在努力解决 sql 中看起来像是关系划分的问题。我需要根据多个条件从同一个 table 中过滤数据。以下是我的 table 的示意图。
| -------|----------------|-----------------|----------------|
|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 |
--------------------------------------------------------------
我需要来自这个名为 Answers 的 RespondenIds 匹配以下过滤器:问题 = 大 and Children and Answer = Yes 和 是 分别针对每个问题。因此,如果我有一个正确的 Sql 查询,我的结果应该 return 我以下数组: [2] 因为唯一的行有答案 Yes 问题 Big 问题 Yes Children 的答案 Yes ] 是 RespondentId = 2 的那个。
此外,提供的问题和答案不是固定的,应该是模块化的。例如,我应该能够更改答案或删除问题,而不必更改查询的整个结构。
你能帮我找到这个问题的正确查询吗?我一直在寻找@Erwin Brandstetter 提供的很多解释,但其中 none 符合我的需要。
您可以检查与条件
匹配的问题和答案的行的计数 = 2 的结果
select RespondentId
from Answers
when question in ( 'Big', 'Children')
and Answer ='Yes'
group by RespondentId having count(*) = 2
我认为您正在寻找的是 Pivot the table。不同的数据库有不同的语法。您有效地将 "Question" 列的值转换为它们自己的列,然后查找符合您的条件的行。
这是标准 SQL 中的一个低效示例,我为每个问题创建一个 table 并使用 RespondentId 将它们合并为一个 table。
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';
我会这样做:
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 参数并解析为单独的比较值。
我正在努力解决 sql 中看起来像是关系划分的问题。我需要根据多个条件从同一个 table 中过滤数据。以下是我的 table 的示意图。
| -------|----------------|-----------------|----------------|
|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 |
--------------------------------------------------------------
我需要来自这个名为 Answers 的 RespondenIds 匹配以下过滤器:问题 = 大 and Children and Answer = Yes 和 是 分别针对每个问题。因此,如果我有一个正确的 Sql 查询,我的结果应该 return 我以下数组: [2] 因为唯一的行有答案 Yes 问题 Big 问题 Yes Children 的答案 Yes ] 是 RespondentId = 2 的那个。
此外,提供的问题和答案不是固定的,应该是模块化的。例如,我应该能够更改答案或删除问题,而不必更改查询的整个结构。
你能帮我找到这个问题的正确查询吗?我一直在寻找@Erwin Brandstetter 提供的很多解释,但其中 none 符合我的需要。
您可以检查与条件
匹配的问题和答案的行的计数 = 2 的结果select RespondentId
from Answers
when question in ( 'Big', 'Children')
and Answer ='Yes'
group by RespondentId having count(*) = 2
我认为您正在寻找的是 Pivot the table。不同的数据库有不同的语法。您有效地将 "Question" 列的值转换为它们自己的列,然后查找符合您的条件的行。
这是标准 SQL 中的一个低效示例,我为每个问题创建一个 table 并使用 RespondentId 将它们合并为一个 table。
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';
我会这样做:
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 参数并解析为单独的比较值。