2012-01-07 1 views
8

Я использую SQL Server 2008Как подсчитать выигрыши и потери с помощью СУММЫ и СЛУЧАЯ?

Я пытаюсь подсчитать выигрыши и потери для любого мотоцикла. Каждый раз, когда пользователь голосует, он проголосует за один велосипед (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  6 

Прямо сейчас, мои результаты выглядят так :

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 

Что мне нужно сделать, чтобы получить результаты на одной линии?

ответ

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 

Проблема в ваших заявлениях о случаях не распространяется на все условия и поэтому возвращает null для случаев, когда они не учитывали.

Кроме того, вы не нуждались в группе голосованием, поскольку вы фактически не выбираете голосование вне агрегатов.

+0

Ничего себе, я просто избавился от «группы по» и получил мой ответ. Благодаря! Для возможных ответов есть только 1 и 0. Я не думаю, что ELSE необходим, не так ли? –

+0

Я бы сохранил его там для полноты. Понятно, что это не обязательно, так как вы работаете без него. Я думаю, он читает с ним более четко. –

+0

Джейк, спасибо за помощь !!! –

3

Предполагая Vote является bit:

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

Если Vote не bit, вы можете избавиться от 0 + в расчете Wins.

+0

Голосование - это int, используя только 0 и 1 в качестве параметров. Ваш SQL выглядит очень читаемым и чистым. –

3

Предполагая Vote является Int и принимает только 0 или 1 значения, вы можете также использовать это:

SELECT 
    SUM(Vote) AS Wins, 
    COUNT(*) - SUM(Vote) AS Losses 
FROM Votes 
WHERE BikeID = 101 
Смежные вопросы