【问题标题】:SQL : How to sum multiple bit columns in a rowSQL:如何对一行中的多个位列求和
【发布时间】:2017-01-21 09:33:12
【问题描述】:

我有一个每行有重复位列的数据结构

如何获得每行的 True 总数?例如
总编号
03 2
17 0
21 3
24 2

【问题讨论】:

    标签: sql sql-server sum type-conversion


    【解决方案1】:

    下面的查询应该在 MS SQL 中为您提供所需的输出。

    select id , (convert (int,OK_1112) + convert (int,OK_1213) + convert (int,OK_1314)+convert (int,OK_1516)) AS total from Table_Name
    

    这里,id 列在 int 中,OK_1112、OK_1213、OK_1314、OK_1516 列的类型为 bit

    【讨论】:

      【解决方案2】:

      如果您有大量的 OK 字段,并且不想对其进行编码,请尝试以下操作

      Declare @YourTable table (Id int,OK_1112 bit,OK_1213 bit,OK_1314 bit,OK_1415 bit,OK_1516 bit)
      Insert into @YourTable values
      (3 ,1,1,0,0,0),
      (17,0,0,0,0,0),
      (21,0,0,1,1,1),
      (24,1,1,0,0,0)
      
      Declare @XML xml
      Set @XML = (Select * from @YourTable for XML RAW)
      
      Select ID,Total=Sum(cast(Value as int))
       From (
              Select ID    = r.value('@Id','int')
                    ,Item  = attr.value('local-name(.)','varchar(100)')
                    ,Value = attr.value('.','varchar(max)') 
               From  @XML.nodes('/row') as A(r)
               Cross Apply A.r.nodes('./@*[local-name(.)!="Id"]') as B(attr)
            ) A
       Group By ID
      

      返回

      ID  Total
      3   2
      17  0
      21  3
      24  2
      

      仅供参考,如果您只是运行子查询,您将看到以下内容

      ID  Item    Value
      3   OK_1112 1
      3   OK_1213 1
      3   OK_1314 0
      3   OK_1415 0
      3   OK_1516 0
      17  OK_1112 0
      17  OK_1213 0
      17  OK_1314 0
      17  OK_1415 0
      17  OK_1516 0
      21  OK_1112 0
      21  OK_1213 0
      21  OK_1314 1
      21  OK_1415 1
      21  OK_1516 1
      24  OK_1112 1
      24  OK_1213 1
      24  OK_1314 0
      24  OK_1415 0
      24  OK_1516 0
      

      【讨论】:

        【解决方案3】:

        出于教育目的,这里是带有UNPIVOT的版本:

        DECLARE @t TABLE (id INT, ok1112 bit, ok1213 BIT, ok1314 BIT, ok1415 BIT, ok1516 BIT)
        INSERT INTO @t VALUES
        (3, 1, 1, 0, 0, 0),
        (17, 0, 0, 0, 0, 0),
        (21, 0, 0, 1, 1, 1),
        (24, 1, 1, 0, 0, 0)
        
        SELECT id, SUM(CAST(a AS int)) AS Total
        FROM @t
        UNPIVOT(a FOR b IN(ok1112, ok1213, ok1314, ok1415, ok1516))u
        GROUP BY id
        

        【讨论】:

          【解决方案4】:

          bit 转换为Int 并进行算术运算

          select id,cast([Ok_1112] as Int)+cast([Ok_1213] as Int)+...
          From yourtable
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-26
            • 2020-07-24
            相关资源
            最近更新 更多