Sql 如何使用SUM和CASE统计赢和输?
我正在使用SQLServer2008 我试图统计任何一辆自行车的胜负。每次用户投票时,他都会对一辆自行车投赞成票(1),对另一辆自行车投反对票(0) 我的投票表如下所示: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
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看起来非常可读且干净。