【问题标题】:Return ID based on group values根据组值返回 ID
【发布时间】:2018-03-17 16:00:57
【问题描述】:

对于表 t1 的样本子集

+----+------+
| ID | Flag |
+----+------+
|  1 |    1 |
|  1 |    0 |
|  1 |    0 |
|  2 |    0 |
|  2 |    0 |
|  2 |    0 |
|  3 |    1 |
|  3 |    1 |
|  3 |    0 |
+----+------+

我需要以两种不同的方式根据 Flag 值提取 ID:

1) Flag 中没有 1 的所有 ID。

    +----+
    | ID |
    +----+
    |  2 |
    +----+

2) Flag 中包含多个 1 的所有 ID。

    +----+
    | ID |
    +----+
    |  3 |
    +----+

尝试的查询没有用,因此被排除在外

【问题讨论】:

    标签: sql sql-server sql-server-2012 subquery


    【解决方案1】:

    实现此目的的一种简单方法是使用案例聚合。例如:

    DECLARE @T TABLE (ID INT, Flag BIT);
    INSERT @T VALUES (1, 1), (1, 0), (1, 0), (2, 0), (2, 0), (2, 0), (3, 1), (3, 1), (3, 0);
    
    SELECT ID
    FROM @T
    GROUP BY ID
    HAVING COUNT(CASE WHEN Flag = 1 THEN 1 END) = 0; -- No flag 1.
    
    SELECT ID
    FROM @T
    GROUP BY ID
    HAVING COUNT(CASE WHEN Flag = 1 THEN 1 END) > 1; -- More than one flag 1.
    

    【讨论】:

      【解决方案2】:

      这是一段特殊情况的代码,因为标志是数字和 1 或 0。

      SELECT ID,
          CASE
              WHEN Ones = 0
                  Then 'No active flags'
              When Ones > 1 
                  Then 'Multiple Active flags'
          END
      FROM (
          SELECT ID,
             Sum(Cast(Flag as int)) as Ones 
          FROM t1
          GROUP BY ID 
          ) as Src
      WHERE Ones != 1
      

      【讨论】:

        【解决方案3】:

        使用以下查询检查标志的总数。

        1)

        SELECT id,
               SUM(flag) cnt
          FROM t1  
         GROUP BY id
        HAVING SUM(flag) = 0
        

        结果

        id  cnt
        2   0
        

        2)

        SELECT id,
               SUM(flag) cnt
          FROM t1  
         GROUP BY id
        HAVING SUM(flag) > 1
        

        结果

        id  cnt
        3   2
        

        【讨论】:

        • 请。签入上述操作数数据类型位的查询对于求和运算符无效。
        • 是位数据类型吗?
        • 是的。感谢您指出了这一点。很高兴知道这一点无法相加。 CAST to int 将使这项工作。
        【解决方案4】:

        只要您的标志是数字并且只有 1 和 0 的值,那么您可以使用以下两个查询:

        select ID from t1 group by ID having sum(cast(flag as int)) = 0;
        

        select ID from t1 group by ID having sum(cast(flag as int)) > 1;
        

        【讨论】:

        • 请。签入上述操作数数据类型位的查询对于求和运算符无效。
        • 一个简单的标志转换为 int 将解决这个问题。我确实指定了“只要您的标志是数字”,位数据类型并不是真正的数字,它是一种逻辑数据类型。数值数据类型适用于传统的数值运算,例如加法和 SUM 等扩展聚合。
        猜你喜欢
        • 1970-01-01
        • 2023-02-02
        • 2021-10-04
        • 1970-01-01
        • 2021-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多