【问题标题】:SQL Server : do not Select all if trueSQL Server:如果为真,则不要全选
【发布时间】:2016-08-25 03:32:06
【问题描述】:

我有这些专栏

Id  Status
----------
 1  pass
 1  fail
 2  pass
 3  pass

我如何选择所有只有pass 状态但如果Id 至少有一个失败,它也不会被选中。

【问题讨论】:

    标签: sql sql-server select count


    【解决方案1】:

    如果同一个id可以有多个pass

    SELECT id
    from table 
    WHERE status = 'pass' 
    and id NOT IN (SELECT id FROM table WHERE status = 'fail')
    

    【讨论】:

    • 您好,非常感谢!我遇到了麻烦,因为即使逻辑正确,它也无法正常工作。原来内部 SELECT 返回一些空值,所以我只需要添加 IS NOT NULL。非常感谢!
    【解决方案2】:

    您需要使用GROUP BY & HAVING 子句

    SELECT Id  
    FROM yourtable
    GROUP BY Id
    HAVING Sum(case when status ='pass' then 1 else 0 end) = count(status)
    

    HAVING子句可以改成

    HAVING Count(case when status ='pass' then 1 end) = count(status)
    

    【讨论】:

    • 如果一个(或多个)状态值为NULL怎么办?
    • 我更喜欢这个而不是进行子查询,我这边 +1
    • 我也是。 +1。只需更改计数 false 并检查它是否为 0。
    【解决方案3】:

    我只是讨厌喋喋不休的案例陈述,所以

    SELECT Id
    FROM table1
    GROUP BY Id
    HAVING COUNT(DISTINCT [Status]) = 1 AND MIN([Status]) = 'pass'
    

    SELECT Id
    FROM table1
    GROUP BY Id
    HAVING COUNT(NULLIF([Status], 'fail')) = 1 AND COUNT(NULLIF([Status], 'pass')) = 0
    

    第二个查询仅在状态有两个值“通过”和“失败”时有效。

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      相关资源
      最近更新 更多