2011-10-12 5 views
1

特定のIDを持つ行の合計数を選択する必要がありますIFこれは表の合計最大行と同じです。合計行数が特定のIDを持つ行数と等しい場合は、カウント値を選択するだけです

私はこの例では、変数を使用していますが、私は

DECLARE @a int, @b int 

--total with special field (redcar = yes) 
SELECT @a = (SELECT COUNT(*) FROM dbo.car WHERE redcar = 'yes') 

-- max total of table 
SELECT @b = (SELECT COUNT(*) FROM dbo.car) 

IF(@a = @b) 
BEGIN 
SELECT @a 
END 

id redcar 
1 yes 
2  
3 yes 
4 
5 
6 

dbo.car出力は0にしてくださいだけ 1 select文でそれを行うしたいと思います赤い車がテーブルの合計行数と等しくないので

答えて

3

これはトリックを行う必要は:

SELECT ISNULL(b.numrows, 0) as numrows 
FROM (
    SELECT COUNT(*) AS numrows FROM car 
) a 
LEFT JOIN (
    SELECT COUNT(*) AS numrows FROM car WHERE redcar = 'yes' 
) b ON b.numrows = a.numrows 
2

caseを使用することができます

SELECT case when count(*) = (select count(*) from dbo.car) then count(*) 
     else 0 
     end 
FROM dbo.car 
WHERE redcar = 'yes' 

条件が満たされない場合、これは0と一列を返します。一致した行数は、行の合計数が異なる場合、O 0を返します。 ifステートメントは、行セットをまったく返しません。このためにクライアントコードを調整する必要があります。

+0

それはエラーなしで実行されますがredcarsがテーブルのない等しい全最大行数を行い、合計しても私はちょうど総最大行数を取得します。私はちょうどテーブルの図を掲示した。 – tdjfdjdj

+0

@ user719825 - あなたはまだ私のクエリを試しましたか? – JNK

+0

@ user719825:クエリが編集され、行数が一致しない場合は0が返されます – Andomar

4

私は考えることができる最速の方法:あなたはすべての行を返すようにしたいので

SELECT COUNT(*) 
FROM dbo.car 
WHERE NOT EXISTS (SELECT 1 FROM dbo.CAR where COALESCE(redcar, '') <> 'yes') 

、任意の行があなたの条件を満たしていない場合、これはちょうどチェックし、もしそうなら、それは0または何も返す必要があります。

+0

'redcar'に' NULL'値がない場合、これは正しくなります。 –

+0

これは言う:各列のために、非赤い車があるかどうか点検しなさい。その後、一致する行の数を数えます。クエリオプティマイザがなければ、これは各行に対して1つのテーブルスキャンまたはO(N^2)アルゴリズムを実行します。 – Andomar

+1

@Andomar - それは相関がないので、チェックを1回だけ実行します。 – JNK

2

私はあなたがこのような何かができると思い:

SELECT count(*) 
    FROM dbo.car 
HAVING count(*) = sum (Case When redcar = 'yes' Then 1 Else 0 End) 

またはこの:

SELECT allcars 
    FROM (SELECT COUNT(*) redcars FROM dbo.car WHERE redcar = 'yes') as redcars 
    cross join (SELECT COUNT(*) allcars FROM dbo.car) as allcars 
WHERE redcars = allcars 

をしかし、なぜあなたは1つのクエリをしたいですか?あなたのコードのような変数を使って読むのははるかに簡単です。

+0

これはエラーなく実行されますが、redcarsの合計がテーブルの合計最大行の数と等しくなくても、最大の最大行を取得します。私はちょうどテーブルの図を掲示した。 – tdjfdjdj

関連する問題