【问题标题】:How can I SUM rows that have at least X Boolean 1s?如何对至少有 X 个布尔 1 的行求和?
【发布时间】:2016-06-28 19:13:34
【问题描述】:

示例表:

col1 col2 col3 col4
Abe  1    0    1
Bob  0    1    0
Cam  1    1    1
Dan  1    0    0
Eve  1    1    1

如何查询SUMcol1中有多少人一共有2个1? (所以,由于 Abe 是唯一有 2 个 1 的人,因此查询输出数字 1。)

谢谢。

【问题讨论】:

    标签: sql sum boolean


    【解决方案1】:
    Select count(*) from table_name where col2+col3+col4=2
    

    【讨论】:

      【解决方案2】:

      如果您的列值仅包含01,那么Vlad Călin BuzeascaisEdge 答案将适合您。但如果它可以有01 以外的其他值,你需要这个。

      SELECT COUNT(*)
      FROM Table_Name 
      WHERE (CASE WHEN col2 = 1 THEN 1 ELSE 0 END) +
            (CASE WHEN col3 = 1 THEN 1 ELSE 0 END) +
            (CASE WHEN col4 = 1 THEN 1 ELSE 0 END) = 2
      

      【讨论】:

      • 在你的 else 语句中使用 0 会更标准,特别是如果有人想扩展他们的标准来表示超过 1 > 1
      【解决方案3】:
      ;WITH cte AS (
          SELECT 'Abe' AS Col1, CAST(1 AS BIT) as Col2, CAST(0 AS BIT) as Col3, CAST(1 AS BIT) AS Col4
          UNION ALL
          SELECT 'Bob' AS Col1, CAST(0 AS BIT) as Col2, CAST(1 AS BIT) as Col3, CAST(0 AS BIT) AS Col4
          UNION ALL
          SELECT 'Cam' AS Col1, CAST(1 AS BIT) as Col2, CAST(1 AS BIT) as Col3, CAST(1 AS BIT) AS Col4
          UNION ALL
          SELECT 'AbeWNull' AS Col1, CAST(1 AS BIT) as Col2, CAST(NULL AS BIT) as Col3, CAST(1 AS BIT) AS Col4
      )
      
      SELECT *
      FROM
          cte
      WHERE
          ISNULL(CAST(Col2 AS INT),0) + ISNULL(Col3,0) + ISNULL(Col4,0) = 2
      

      cte 为您提供了一些测试数据。 2 件事。 1 如果它是Booleanbit 列,您可能必须将cast/convert 转换为integernumeric 数据类型至少其中一列,否则添加将不起作用。是的,我测试过并且需要。其次,如果你不处理null 的潜力,你可能得不到你想要的答案。

      例如。

      SELECT 1 + NULL + 1
      

      会给你NULL

      在列上使用SUM 是不一样的,它只会忽略nulls,但不会在添加行期间。

      【讨论】:

      • 感谢您的提示
      【解决方案4】:

      在 where 子句中使用添加列并选择 count()

       select count(*)
       from my_table 
       where CAST(ifnull(col2,false) AS SIGNED INTEGER) + 
             CAST(ifnull(col3,false) AS SIGNED INTEGER) +
             CAST(ifnull(col4,false) AS SIGNED INTEGER)  = 2;
      

      【讨论】:

      • 您可以评价为有用,.. 现在您已超过 15 岁
      • 唯一的事情。如果所有列都是数据类型位,则至少需要转换为 1。此外,如果其中一列中存在空值,则整个加法操作将变为空值(又名未知)
      • @Matt 。我已经为您的评论更新了明确转换的答案
      • 看起来不错。我知道在 sql-server 中,因为数据是如何自动合并的,所以我只需要转换 1 列,但对于 mysql 和其他一些列来说看起来不错。我发布了一个 sql-server 答案,所以看起来我们已经涵盖了它:)
      • 你的欢迎 我也为你投票 我看到你第一个正确答案只是认为我会帮助缓解我过去在自己添加位值时看到的几个特定陷阱,但你有没错
      猜你喜欢
      • 2015-06-04
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多