对于类型为' bit'的列的聚合逻辑AND / OR

时间:2017-06-01 01:16:40

标签: sql sql-server tsql aggregate sql-server-2016

对于T-SQL(SQL Server 2016)bit类型,是否有某种方法可以实现逻辑AND和逻辑OR的聚合等效?例如,使用此表:

CREATE TABLE #Example       (id int, category int, isRed bit, isBlue bit)
INSERT INTO #Example VALUES (     1,            1,         1,          1)
INSERT INTO #Example VALUES (     2,            1,         0,          0)
INSERT INTO #Example VALUES (     3,            1,         1,          0)
INSERT INTO #Example VALUES (     4,            2,         0,          1)
INSERT INTO #Example VALUES (     5,            2,         0,          1)
INSERT INTO #Example VALUES (     6,            2,         0,          1)

我想创建一个查询,按类别列出任何 isRed是否已设置(OR),以及 all isBlue的设置(AND),例如输出:

category  anyRed  allBlue
       1       1        0
       2       0        1

也就是说,我喜欢之类的东西:

SELECT
  category,
  OR(isRed) isAnyRed,
  AND(isBlue) isAllBlue
FROM
  #Example
GROUP BY
  category

我唯一能想到的就是:

SELECT
  category,
  MAX(isRed) isAnyRed,
  MIN(isBlue) isAllBlue
FROM
  #Example
GROUP BY
  category

哪个不起作用,给出错误:

Operand data type bit is invalid for max operator.

所有其他聚合函数都会出现类似的结果。

2 个答案:

答案 0 :(得分:4)

可以使用

MINMAX函数:

SELECT
  category,
  MAX(CONVERT(tinyint,isRed)) isAnyRed,
  MIN(CONVERT(tinyint,isBlue)) isAllBlue
FROM
  #Example
GROUP BY
  category

但您必须将bit转换为某个数字值(tinyint),因为MINMAX仅适用于数字,而不是布尔值。

答案 1 :(得分:0)

您可以使用子查询并查找如下:

Select Category, AnyRed = Case When SmRed > 0 then 1 else 0 End,
        AllBlue = Case When SmBlue = Cnt then 1 else 0 End from  (
    select category, SMRed = sum(iif(isred=1,1,0)), SMBlue = Sum(iif(isBlue=1,1,0)), Cnt= Count(id) from #Example
    group by category
) a