Sql 如何使用SUM和CASE统计赢和输?

Sql 如何使用SUM和CASE统计赢和输?,sql,tsql,Sql,Tsql,我正在使用SQLServer2008 我试图统计任何一辆自行车的胜负。每次用户投票时,他都会对一辆自行车投赞成票(1),对另一辆自行车投反对票(0) 我的投票表如下所示: VoteID --- BikeID ---- Vote 1 100 1 2 101 0 3 100 0 4 101 1 5 102 1 6

我正在使用SQLServer2008

我试图统计任何一辆自行车的胜负。每次用户投票时,他都会对一辆自行车投赞成票(1),对另一辆自行车投反对票(0)

我的投票表如下所示:

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
当我运行一个特定自行车的查询时,我希望我的结果如下所示

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
我的查询如下所示:

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
我需要做什么才能在一条线上得到结果

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


此外,您不需要按投票分组,因为您实际上并不是在聚合之外选择投票。

假设
投票

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

如果
Vote
不是
bit
,您可以在
Wins
计算中去掉
0+

假设
Vote
Int
并且只取
0
1
值,您还可以使用以下方法:

SELECT
  SUM(Vote) AS Wins, 
  COUNT(*) - SUM(Vote) AS Losses
FROM Votes
WHERE BikeID = 101

哇,我刚刚摆脱了“分组方式”,得到了我的答案。谢谢可能的答案只有1和0。我不认为还有其他必要,是吗?为了完整起见,我会把它放在那里。很明显,这是没有必要的,因为没有它,它也可以工作。我认为如果没有负(或正)行,则需要
ELSE 0
。省略它意味着
ELSE NULL
SUM()
将是
NULL
,而不是
0
@ypercube:实际上,一个NULL不会影响整个结果。SUM()仅在没有值可加的情况下返回NULL,这可能是因为根本没有行,也可能是因为所有值都为NULL。SQL Server 2005及更高版本也是如此,OP的情况也是如此。但对于早期版本,你可能是对的,我只是不能肯定。@Andrey:我也是这个意思。如果只有正面投票,那么
损失
将被计算为
总和(NULL,NULL,NULL)
->
NULL
。投票是一个整数,仅使用0和1作为选项。您的SQL看起来非常可读且干净。