2012-01-07 13 views
8

私はSQL Server 2008を使用していますSUMとCASEを使って勝敗を計算する方法は?

私は任意のバイクの勝敗を集計しようとしています。ユーザーが投票するたびに、彼は1つの自転車の投票(1)と別の自転車(0)に対する投票を行います。

私の投票表は次のようになります。私は今、特定の自転車

Wins -- Losses 
5  6 

のクエリを実行したときに私の結果は次のようになりたい

VoteID --- BikeID ---- Vote 
1   100   1 
2   101   0 
3   100   0 
4   101   1 
5   102   1 
6   100   0 
7   102   0 
8   101   1 

、私の結果は次のようになります:

Wins --- Losses 
5  NULL 
NULL  6 

私のクエリは次のようになります。

SELECT SUM(CASE WHEN Vote = 1 THEN 1 END) AS Wins, 
    SUM(CASE WHEN Vote = 0 THEN 1 END) AS Losses 
FROM  Votes 
WHERE BikeID = 101 
GROUP BY Vote 

結果を1行にまとめるには、何が必要ですか?

答えて

6
SELECT SUM(CASE WHEN Vote = 1 THEN 1 ELSE 0 END) AS Wins, 
    SUM(CASE WHEN Vote = 0 THEN 1 ELSE 0 END) AS Losses 
FROM  Votes 
WHERE BikeID = 101 

問題はあなたのケースステートメントがすべての条件をカバーしていないため、説明しなかったケースでnullを返していました。

また、実際には集計外の投票を選択していないため、投票でグループを作成する必要はありませんでした。 Voteを想定し

+0

うわー、私はちょうど「でグループ」を取り除くと私の答えを得ました。ありがとう!可能な回答は1と0しかありません。私はELSEが必要ではないと思いますか? –

+0

私は完全性のためにそこに保管します。明らかに、それはあなたがそれなしで働いているので、必要ではありません。私はそれがそこでそれをより明確に読むと思う。 –

+0

ジェイク、助けてくれてありがとう! –

3

bitです:

SELECT 
    Wins = SUM(0 + Vote), 
    Losses = SUM(1 - Vote) 
FROM Votes 
WHERE BikeID = 101 

Votebitされていない場合、あなたはWins計算に0 +を取り除くことができます。

+0

投票はintで、オプションとして0と1のみを使用します。あなたのSQLは、本当に読みやすく、きれいに見えます。 –

3

VoteIntであり、唯一の0または1の値をとると仮定すると、あなたもこれを使用することもできます。

SELECT 
    SUM(Vote) AS Wins, 
    COUNT(*) - SUM(Vote) AS Losses 
FROM Votes 
WHERE BikeID = 101 
関連する問題