2012-01-07 9 views
8

Sto utilizzando SQL Server 2008Come accumulare vincite e perdite utilizzando SUM e CASE?

Sto provando a calcolare le vittorie e le perdite per ogni bici. Ogni volta che un utente vota, emette un voto per una bici (1) e un voto contro un'altra bici (0).

Il mio tavolo voto si presenta così:

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 

Voglio che i miei risultati a guardare come questo quando ho eseguito una query per una bici specifica

Wins -- Losses 
5  6 

In questo momento, i miei risultati hanno questo aspetto :

Wins --- Losses 
5  NULL 
NULL  6 

la mia domanda è simile al seguente:

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 

Cosa devo fare per ottenere i risultati su una riga?

risposta

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 

Il problema è che le dichiarazioni del caso non coprivano tutte le condizioni, e quindi restituivano null per i casi in cui non erano responsabili.

Inoltre, non è stato necessario il gruppo per voto, poiché in realtà non si sta selezionando il voto al di fuori degli aggregati.

+0

Wow, ho appena sono liberato del "gruppo da" e ottenuto la mia risposta. Grazie! C'è solo 1 e 0 per le possibili risposte. Non penso che l'ELSE sia necessario, vero? –

+0

Vorrei tenerlo lì per completezza. Chiaramente non è necessario, come hai fatto senza di esso. Penso che legga più chiaramente lì dentro. –

+0

Jake, grazie per l'aiuto !!! –

3

Supponendo Vote è bit:

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

Se Vote non bit, è possibile sbarazzarsi di 0 + nel calcolo Wins.

+0

Vote è un int, usando solo 0 e 1 come opzioni. Il tuo SQL sembra davvero leggibile e pulito. –

3

Supponendo Vote è Int e richiede solo 0 o 1 valori, si potrebbe anche usare questo:

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