【问题标题】:Aggregate bit column simulating AND operator模拟AND运算符的聚合位列
【发布时间】:2018-04-12 15:23:45
【问题描述】:

我必须汇总一些行,放入 AND 位列。我让你看一个例子……我有一组这样的数据:

Id   |  BitValue
----------------
1    |     1 
1    |     1
2    |     0
3    |     1
3    |     0      

我希望得到的结果是:

Id   |  BitValue
----------------
1    |     1 <- = (1 AND 1)
2    |     0
3    |     0 <- = (1 AND 0)

如何聚合列以获得我想要的结果?

我已经尝试了这两种解决方案,但没有一个有效:

SUM(CAST(MyBitField AS INT)),
SUM(CASE(MyBitField) WHEN 1 THEN 1 ELSE 0 END)

谁能帮帮我? 谢谢

【问题讨论】:

    标签: sql-server aggregate-functions and-operator


    【解决方案1】:

    如果该列中只有 1 和 0,请将 sumcount 进行比较:

    select Id, case when sum(BitValue) < count(Id) then 0 else 1 end as BitValue 
    from mytable group by Id;
    

    Sql fiddle.

    感谢@Larnu 的有用评论。我发了another sql fiddle 来反映他的担忧。

    【讨论】:

    • 作为一个快速说明,如果 OP 的列 BitValue 存储为 bit,那么您需要将 CAST/CONVERT 的值设置为 tinyint(或相似的)。您不能在 SQL Server 中 SUMbit
    【解决方案2】:

    这是一种方法

    SELECT Id,
           Min(Cast(Bitvalue AS TINYINT)) * Max(Cast(Bitvalue AS TINYINT))
    FROM   yourtable
    GROUP  BY Id 
    

    或者为什么不只是min的Bitvalue

    SELECT Id,
           Min(Cast(Bitvalue AS TINYINT))
    FROM   yourtable
    GROUP  BY Id 
    

    这两种方法都认为BitValue列中没有NULL值

    【讨论】:

      【解决方案3】:

      另一种方法可以是

      SELECT DISTINCT ID, 
          ISNULL((SELECT TOP 1 BitValue FROM TBL T1 WHERE T1.ID=T.ID AND 
          BitValue=0),1) AS  BitValue 
      FROM TBL T
      

      Demo

      【讨论】:

        猜你喜欢
        • 2020-12-17
        • 1970-01-01
        • 2016-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-27
        相关资源
        最近更新 更多