AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 255330
Accepted
learning
learning
Asked: 2019-12-11 10:57:01 +0800 CST2019-12-11 10:57:01 +0800 CST 2019-12-11 10:57:01 +0800 CST

在查询中使用 OR AND 的多个语句条件

  • 772

我有这个调查表,我正在尝试收集回答的用户 ID 的信息非常同意我正在尝试观察我的体重的问题,或者我喜欢喝黑咖啡,并且必须回答同意 或中立或强烈不同意 这些问题当最后期限临近时 ,我会茁壮成长,我只想尝试新事物。

UserId                QUESTION                               Answer
 1010            I am trying to watch my weight           Strongly Agree
 1120            I thrive when a deadline is close        Strongly Agree
 1120           I'm all about trying something new        Neutral
 2025            I'm all about trying something new       Agree
 3024            I love drinking Coffee Black             Strongly Disagree
 3024            I'm all about trying something new       Agree

我尝试编写的查询不断返回我没有编写的问题。这可能不是编写此类查询的最佳方式,但我正在学习如何正确编写这些查询。任何帮助,将不胜感激。

 SELECT userid_
  ,QUESTION 
  ,answer
   FROM [Survey_2019]]

Where QUESTION  = 'I'm trying to watch my weight'  AND
    Answer =  'Strongly agree'
  OR
      QUESTION    = 'I love drinking Coffee Black
  AND 
 Answer =  'Strongly agree'

AND 

 QUESTION= 'I thrive when a deadline is close'
  AND ANSWER= 'Agree' 
OR 'Neutral' OR 'Strongly Disagree'
sql-server condition
  • 2 2 个回答
  • 68 Views

2 个回答

  • Voted
  1. Best Answer
    Akina
    2019-12-11T11:32:55+08:002019-12-11T11:32:55+08:00

    我有这个调查表,我正在尝试收集回答的用户 ID 的信息 非常同意我正在尝试观察我的体重的问题,或者我喜欢喝黑咖啡,并且必须回答同意或中立或强烈不同意这些问题 当最后期限临近时,我会茁壮成长,我只想尝试新事物。

    简化:

              [     A:a        ON     (Q:a/b)   ]
        AND   [  (A:b/c/d)     ON       Q:c     ] 
        AND   [  (A:b/c/d)     ON       Q:d     ]
    

    在 SQL 中:

    SELECT UserId
    FROM Survey_2019
    GROUP BY UserId
    HAVING SUM (CASE WHEN Question IN ('a', 'b') AND Answer = 'a' THEN 1 END) > 0
       AND SUM (CASE WHEN Question = 'c' AND Answer IN ('b', 'c', 'd') THEN 1 END) > 0
       AND SUM (CASE WHEN Question = 'd' AND Answer IN ('b', 'c', 'd') THEN 1 END) > 0
    

    如果您需要匹配的单独记录,则将此 SQL 用作 CTE/子查询并从源表的另一个副本中选择单独的记录。

    更新

    似乎最后两个条件可以使用简化条件合并为一个

        AND   [  (A:b/c/d)     ON       Q:c/d     ] 
    

    但问题是确保提到所有(在这种情况下为 2 个)问题。是的,这是可能的,并且可以使用例如

       AND COUNT(DISTINCT CASE WHEN Question IN ('c','d') 
                                AND Answer IN ('b', 'c', 'd') 
                               THEN Question 
                               END) = 2
    

    如果您需要确保没有感兴趣的问题和答案不在列表中的记录,则使用类似于以下的附加条件

       AND COUNT(CASE WHEN Question IN ('c','d') 
                       AND Answer NOT IN ('b', 'c', 'd') 
                      THEN 1
                      END) = 0
    
    • 1
  2. Abecee
    2019-12-11T12:09:05+08:002019-12-11T12:09:05+08:00

    首先:您缺少许多括号(无论如何)。

    然后:您需要将不同的记录组合成一个结果。@Akina 展示了一种方法。或者,您可以针对同一个表的两个副本运行:

    WITH
    Part1 AS (
      SELECT
        userID
        , question
        , answer
      FROM Survey_2019
      WHERE
        question IN ('I am trying to watch my weight', 'I love drinking Coffee Black')
        AND
        answer = 'Strongly Agree'
    ),
    Part2 AS (
      SELECT
        userID
        , question
        , answer
      FROM Survey_2019
      WHERE
        question IN ('I thrive when a deadline is close', 'I''m all about trying something new')
        AND
        answer IN ('Agree', 'Neutral', 'Strongly Disagree')
    ),
    Overview (userID, question1, answer1, question2, answer2) AS (
      SELECT
        Part1.userID
        , Part1.question
        , Part1.answer
        , Part2.question
        , Part2.answer
      FROM Part1
      JOIN Part2
        ON Part1.userID = Part2.userID
    )
    SELECT
      * FROM Overview ORDER BY userID, question1, question2
    ;
    

    查看实际操作:SQL Fiddle(已将两条记录添加到您的示例数据中以进行实际匹配。)

    如果您主要关心满足条件的用户列表,Akina 的详细方法更合适。(但您当然可以按照 Akina 的建议对其进行扩展。)我的直接提供所有详细信息 - 但如果您的数据可能会为某些用户生成多个匹配项,则可能会变得难以接受。

    然而,Akina 和我对我的方法第 2 部分中的内容的解读有所不同: Akina 期望这两个问题都有答案,如果至少有一个问题得到了回答,我会很满意。- 你最清楚,哪一个是正确的。(两条 SQL 语句都可以做相应的调整。)

    您的桌子设计可能/希望仍在开发中…… ;-)

    如果需要调整/进一步详细信息,请发表评论。

    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve