web-dev-qa-db-ja.com

特定の値を持つT-SQLカウント行(1つのクエリで複数)

T-SQLクエリに関するヘルプが必要です。特別な値(たとえば、> 1)を持つフィールドをカウントします。

私のようなテーブルがあると仮定します:

_IGrp | Item | Value1 | Value2
#############################
A    | I11  | 0.52   | 1.18
A    | I12  | 1.30   | 0.54
A    | I21  | 0.49   | 2.37
B    | I22  | 2.16   | 1.12
B    | I31  | 1.50   | 0.28
_

次のような結果が必要です:

_IGrp | V1High | V2High 
######################
A    | 1      | 2
B    | 2      | 1
_

私の考えでは、これはこの表現で行くべきです

_SELECT IGrp, COUNT(Value1>1) AS V1High, COUNT(Value2>1) AS V2High
FROM Tbl GROUP BY IGrp
_

ただし、Count()はブール値をとらないため、T-SQLでは不可能です。それは本当に_WHERE Value>1_とCOUNT(*)で複数のクエリを実行し、それらを後で結合する唯一の可能な方法ですか?または、目的の結果を達成するためのトリックはありますか?

前もって感謝します。

43
Marks
SELECT IGrp, 
    COUNT(CASE WHEN Value1 > 1 THEN 1 ELSE NULL END) AS V1High, 
    COUNT(CASE WHEN Value2 > 1 THEN 1 ELSE NULL END) AS V2High 
FROM Tbl
GROUP BY IGrp
68
LukeH

CASEステートメントを使用できます。

SELECT IGrp, 
    SUM(CASE WHEN Value1>1 THEN 1 ELSE 0 END) AS V1High, 
    SUM(CASE WHEN Value2>1 THEN 1 ELSE 0 END) AS V2High 
FROM Tbl GROUP BY IGrp 
10
cjk

case whenを利用してください

SELECT IGrp, 
 sum(case when isnull(Value1,0)>1 then 1 else 0 end) AS V1High, 
 sum(case when isnull(Value2,0)>1 then 1 else 0 end) AS V2High 
FROM Tbl GROUP BY IGrp 
3
Pranay Rana
SELECT IGrp, 
    COUNT(CASE WHEN Value1 = 'Foo' THEN 1 ELSE NULL END) AS Tot_Foo, 
    COUNT(CASE WHEN Value1 = 'Blah' THEN 1 ELSE NULL END) AS Tot_Blah 
FROM Tbl
GROUP BY IGrp

これを使用して、同じフィールドの2つの異なる値を比較することもできます。上記のように少し変更します。

1:1の比率で存在するはずの値を検証するのに非常に役立ちます。

2
user2125525

CASE .. WHEN ..ステートメントをCOUNT()関数内に入れて、条件が成立する場合は1を返し、そうでない場合はNULLを返すことができます。

0