Как подсчитать выигрыши и проигрыши, используя SUM и CASE? - PullRequest
8 голосов
/ 07 января 2012

Я использую 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

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

Ответы [ 3 ]

6 голосов
/ 07 января 2012
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 для случаев, когда они не учитывались.

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

3 голосов
/ 08 января 2012

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

SELECT
  SUM(Vote) AS Wins, 
  COUNT(*) - SUM(Vote) AS Losses
FROM Votes
WHERE BikeID = 101
3 голосов
/ 08 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...