2012-01-07 16 views
8

Estoy usando SQL Server 2008¿Cómo contar las ganancias y las pérdidas usando SUM y CASE?

Estoy tratando de contar las victorias y las pérdidas para cualquier bicicleta determinada. Cada vez que un usuario vota, emite un voto por una bicicleta (1) y un voto en contra de otra (0).

Mi voto tabla es el siguiente:

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 

Quiero que mis resultados se vean como esto cuando ejecuta una consulta para una moto específica

Wins -- Losses 
5  6 

En este momento, mis resultados de este aspecto :

Wins --- Losses 
5  NULL 
NULL  6 

Mi consulta es el siguiente: 012

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 

¿Qué tengo que hacer para conseguir los resultados en una línea?

Respuesta

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 

El problema es que las declaraciones de su caso no cubrieron todas las condiciones, por lo que devolveron nulo para los casos en los que no contaban.

Además, usted no necesita el grupo por votación, ya que no está seleccionando el voto fuera de los agregados.

+0

Wow, acabo se deshizo del "grupo por" y tiene mi respuesta. ¡Gracias! Solo hay 1 y 0 para las posibles respuestas. No creo que ELSE sea necesario, ¿verdad? –

+0

Lo mantendría allí para completarlo. Claramente no es necesario, ya que lo tienes trabajando sin él. Creo que se lee más claramente con eso allí. –

+0

Jake, ¡gracias por la ayuda! –

3

Suponiendo Vote es bit:

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

Si no es Votebit, puede deshacerse de 0 + en el cálculo Wins.

+0

Vote is a int, usando solo 0 y 1 como opciones. Su SQL parece realmente legible y limpio. –

3

Suponiendo Vote es Int y toma sólo 0 o 1 valores, también se podría utilizar esto:

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