2012-05-04 6 views
3

downvoteの値が-1で0でないため、のdownvotesの合計を集計しようとすると、この問題が認識されました。これはSQL sum()関数を使用するときに問題が発生します。例えば、私が最初にオフ推測SQLは1と0の値を使って(+1)と(-1)投票を合計する方法は?

vote_id vote 
    1  0 
    2  1 
    3  1 

SELECT sum(vote) //output is 2 

vote_id vote 
    1  -1 
    2  1 
    3  1 

SELECT sum(vote) //output is 1, which is the desired output 

は、私の質問は、理にかなってさえ0, null, and 1を使用しているのですか?または、私はちょうど-1, 0, 1を使うべきですか?

いずれにせよ、私は、0, null, and 1を使用して、上下の票を合計するためにSQLクエリがどのように見えるかを知ることに興味があります。

+0

は、なぜあなたは* * -1、0、1を使用していないだろうか? – JJJ

+0

こんにちは@Juhana、私は私の頭の中で物事を単純にしたいが、同時にベストプラクティスを使用したいからだと思う。 0と1は他のすべてに対して標準的なので、この場合は例外を作成することに懸念がありました。 –

+0

これは、投票が肯定的であるか否定的であるかを判断するブール値でなければならないのですか?あたかも投票がないかのように、記録はありません。または私は何かを逃していますか? –

答えて

4

だろう。

しかし、0NULL1も動作させることができます。

SELECT SUM(vote * 2 - 1) ... 
+1

+1すてきな解決策 – Iridio

1

Oracleでは、それは私が個人的に-101を使用することになり

SUM(decode(vote,0,-1,vote)) 
+0

Oracleユーザーのためのその答えを提供してくれてありがとう、私はmysqlを使用しています、私は実際にそのクエリを試してみましょう... –

+0

残念ながら、MySQLの 'decode()'関数がないようです –

1

簡単な計算は-1と+1に投票列の値を変更します。

SUM(2*(vote-0.5)) 

または、2つのカウントの差を取ってください。

SELECT (SELECT COUNT(*) FROM tbl WHERE vote = 1) 
     -(SELECT COUNT(*) FROM tbl WHERE vote = 0) 
1

私は確かに1,0、-1を使うべきだと思います。それだけですべてが簡単になります。また、単一のビットフィールドを使用してスペースを節約することもできないので、ここでそれを使用しようとする本当の理由はありません。

2

したがって、質問は次のようになります。集計関数を計算するときにNULLが除外されていますか?

答えはYESです。 Wikipedia's article on NULL values状態:

SQLサーバー側にデータに集計 計算を簡略化するために集計関数を定義します。ほとんどすべての集計関数は、 Null除去ステップを実行するため、NULL値は計算の最終結果に含まれません。ただし、この暗黙的なNull削除、 は、集計関数の結果に影響を与える可能性があります。

したがって、あなたがSUM集計機能から除外する値のため0またはNULLを行うかどうかは関係ありません。

SELECT 
    SUM(CASE WHEN Vote = 0 THEN -1 ELSE VOTE END) as 'Votes' 
FROM 
    MyTable 
+2

違いがあります... 'AVG()'を試してみてください。そのため、私は '-1、NULL、1'を好むでしょう。 – MatBailie

+1

@Demsあなたが正しいです、私は答えを更新して、' SUM'集計関数にのみ適用しました。 –

1

また、このような何かのためにCASEを使用することができます(1の量のために)

select count (*) from table where vote = 1

-1

select count (*) from table where vote <> 1(-1の量のために):だけでなく、それは、MySQLで有効である必要があり、私はそれSQL Serverでたくさんやる、と仮定 -

+0

<> 1には正解を与えていないと考えられるnullが含まれていますが、説明は便利です – Mark

関連する問題