对于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.
所有其他聚合函数都会出现类似的结果。
答案 0 :(得分:4)
MIN
和MAX
函数:
SELECT
category,
MAX(CONVERT(tinyint,isRed)) isAnyRed,
MIN(CONVERT(tinyint,isBlue)) isAllBlue
FROM
#Example
GROUP BY
category
但您必须将bit
转换为某个数字值(tinyint
),因为MIN
和MAX
仅适用于数字,而不是布尔值。
答案 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