在SQL中如何使用1和0值总结(+1)和向下(-1)投票?

时间:2012-05-04 15:30:00

标签: mysql sql sum

我在尝试总结投票 AND downvotes时意识到了这个问题,因为downvote的值是-1而不是0.这在使用SQL sum()函数时会导致问题。例如,

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查询是什么样的。

7 个答案:

答案 0 :(得分:4)

我个人会使用-101

但是,0NULL1也可以投放使用:

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

答案 1 :(得分:2)

所以问题是:在计算聚合函数时是否排除NULL

答案是肯定的。 Wikipedia's article on NULL values州:

  

SQL定义聚合函数以简化服务器端聚合   数据计算。几乎所有聚合函数都执行a   空消除步骤,使Null值不包括在内   最终的计算结果。这种隐含的Null消除,   但是,会对聚合函数结果产生影响。

因此,对于要从0聚合函数中排除的值,您是NULL还是SUM无关紧要。

答案 2 :(得分:1)

在oracle中它将是

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

答案 3 :(得分:1)

简单计算会将投票列值更改为-1和+1。

SUM( 2*(vote-0.5))

或者取两者之间的数量差异。

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

答案 4 :(得分:1)

我认为你绝对应该使用1,0和-1。它让一切变得更轻松。您也可能无法使用单个位字段保存任何空间,因此没有充分的理由尝试在此处使用它。

答案 5 :(得分:1)

你也可以使用CASE这样的东西 - 我在SQL Server中做了很多,并假设它在MySQL中也应该有效:

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

答案 6 :(得分:-1)

select count (*) from table where vote <> 1(数量为-1)

select count (*) from table where vote = 1(金额为1)