2010-12-10 14 views
4

私のテーブル内のデータの要約ビューを計算しようとしていますが、クエリが機能する瞬間には、テーブルが結局10,000 +私も同じ日付でそれぞれをフィルタリングする必要がある、私は各カウントのwhereステートメントでこれを行うことができることを実現するが、これは非常に効率的ではありません。条件が同じ行の複数のカウント

また、最終的に最終的に計算するのは、選択するのではなくフィールドを操作する方が簡単です。

(SELECT COUNT (*) FROM Contracts WHERE contractWon = 1) Won, 
(SELECT COUNT (*) FROM Contracts WHERE contractPassedToCS = 1) PassedtoCS, 
(SELECT COUNT (*) FROM Contracts WHERE contractPassedToCS = 0) as OutstandingWithSales, 
(SELECT COUNT (*) FROM Contracts WHERE contractIssued = 1) as ContractsIssued, 
(SELECT COUNT (*) FROM Contracts WHERE contractReturned = 1) as ContractsReturned, 
(CONVERT(decimal, (SELECT COUNT (*) FROM Contracts WHERE contractReturned = 1))/  CONVERT(decimal, (SELECT COUNT (*) FROM Contracts WHERE contractIssued = 1))) * 100 as '% Outstanding' 

は、私はおそらくいくつかの必要な接合があることを理解が、私は少し混乱しています。

ありがとうございました。

答えて

4
SELECT 
    SUM(contractWon) AS Won, 
    SUM(contractPassedToCS) AS PassedtoCS, 
    SUM(1-contractPassedToCS) AS OutstandingWithSales, 
    SUM(contractIssued) AS contractIssued , 
    SUM(contractReturned) AS contractReturned, 
    100.0 * SUM(contractReturned)/SUM(contractIssued) AS '% Outstanding' 
FROM 
    Mytable 

集計することができない「ビット」データ型の代わりの形式。列がint型であれば、たとえば、上記のクエリは動作します

--Either CAST first to a type that aggregates... 
    SUM(CAST(contractWon AS int)) AS Won, 

    -- .. or rely on COUNT ignores NULL values 
    COUNT(CASE contractWon WHEN 1 THEN 1 ELSE NULL END) AS Won, 
+0

ラップSUM(のそれらのそれぞれ)と私は、私は1 1あなたは(にコメントするかどう –

+0

:-)それを+1ますコラムが1/0で表されるブール値であることを前提としています(これはOPが示していません)。 – Ronnis

+0

@ロンニス:ありがとう、それを明確に – gbn

関連する問題