繁体   English   中英

如何在SQL表上应用多重过滤器

[英]How can I apply mutliple filters on my sql tables

我在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 ,称为Answers ,它与以下过滤器匹配: Question = Big and ChildrenAnswer = YesYes分别是每个问题。 因此,如果我将有一个正确的Sql查询,我的结果应返回以下数组: [2]因为唯一的行对问题Big的回答为Yes ,对问题Children的回答为Yes的那一行是具有RespondentId = 2的那个。

同样,提供的问题和答案不是固定的,应该模块化。 例如,我应该能够更改答案或删除问题,而不必更改查询的整个结构。

您能帮我找到关于这个问题的正确查询吗? 我一直在寻找@Erwin Brandstetter提供的很多解释,但没有一个符合我的需求。

我这样做是:

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参数,然后解析为单独的比较值。

您可以检查结果是否为等于问题和答案的行的count = 2

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

我认为您正在寻找的是旋转桌子。 不同的数据库有不同的语法。 您可以有效地将“问题”列的值转换为它们自己的列,然后查找与您的条件匹配的行。

这是标准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';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM