2017-06-01 2 views
1

T-SQL(SQL Server 2016)bit型の場合、論理積と論理和の集計に相当する方法はありますか?たとえば、この表で:isRedどのが設定されている(OR)、および場合はisBlueの全てが(設定されている場合はタイプ 'ビット'を持つ列の論理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) 

私は、カテゴリごとに、一覧表示するクエリを作成したいのですが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. 

他のすべての集計関数でも同様の結果が得られます。

答えて

3

MINMAXの機能が使用できます。

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

しかし、あなたは数字だけではなく、ブール値とMINMAX作品として、いくつかの数値(tinyint)にbitを変換する必要があります。

+2

を疑いの余地なくシンプル。完璧、ありがとう。 –

+1

@JasonC MINとMAXを使った解が正しい場合、問題はCONVERTにあります。助けてうれしい! – Backs

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 
関連する問題