2013-05-15 2 views
3

я в следующей таблице:SQL Server усредняет/Суммирование/Группы/Считают запросы Issue

 
╔══════════╦════════╦═══════╦═══════╗ 
║ PlayerID ║ GameID ║ Stat1 ║ Stat2 ║ 
╠══════════╬════════╬═══════╬═══════╣ 
║  1 ║ A  ║  2 ║  1 ║ 
║  1 ║ B  ║  4 ║  2 ║ 
║  1 ║ C  ║  6 ║  5 ║ 
║  2 ║ A  ║  2 ║  4 ║ 
║  2 ║ B  ║  2 ║  6 ║ 
║  2 ║ C  ║  2 ║  8 ║ 
║  2 ║ D  ║  4 ║  2 ║ 
║  2 ║ E  ║  6 ║  1 ║ 
║  3 ║ A  ║  5 ║  9 ║ 
║  3 ║ G  ║  6 ║  4 ║ 
║  3 ║ H  ║  4 ║  2 ║ 
║  3 ║ N  ║  8 ║  6 ║ 
╚══════════╩════════╩═══════╩═══════╝ 

То, что я пытаюсь достичь следующее:

 
╔══════════╦═══════════╦═══════════════════╦═══════════════════╗ 
║ PlayerID ║ GameCount ║ Stat 1 Avg/Game ║ Stat 2 Avg/Game ║ 
╠══════════╬═══════════╬═══════════════════╬═══════════════════╣ 
║  1 ║   3 ║ 4     ║ 2.66    ║ 
║  2 ║   5 ║ 3.2    ║ 4.2    ║ 
║  3 ║   4 ║ 5.75    ║ 5.25    ║ 
╚══════════╩═══════════╩═══════════════════╩═══════════════════╝ 

Отсчет игры должен быть общее количество игр для каждого игрока и статистика должны быть в среднем за игру. В основном расчет PlayerID 1 состоит в следующем:

"Stat1 Среднее/Игра" = (2 + 4 + 6)/3 "STAT2 Среднее/Игра" = (1 + 2 + 5)/3

Я пробовал множество вариантов одного и того же запроса с комбинацией SUMS и COUNTS, но GameCount никогда не выходит правильно. Пример того, что я пробовал, ниже

SELECT PlayerID, 
COUNT(GameID) AS GameCount, 
SUM(Stat1)/COUNT(GameID) "Stat 1 Avg/Game", 
SUM(Stat2)/COUNT(GameID) "Stat 2 Avg/Game" 
FROM PublishedStats A 
GROUP BY PlayerID 

SELECT PlayerID, 
COUNT(GameID) OVER (PARTITION BY PlayerID) AS GameCount, 
SUM(Stat1)/COUNT(GameID) OVER (PARTITION BY PlayerID) "Stat 1 Avg/Game", 
SUM(Stat2)/COUNT(GameID) OVER (PARTITION BY PlayerID) "Stat 2 Avg/Game", 
FROM Stats 
GROUP BY PlayerID, GameID 
+0

Я думаю, что ваш первый запрос правильный, и вам не нужен второй. – Jasmine

+0

Если «GameID» не содержит значений NULL, я согласен с @Jasmine - какие значения вы действительно получаете от своего первого запроса? –

+0

@Jasmine Извините, что я создал базовые данные неправильно, PlayerID 1 должен иметь две статистики для игры A и один для игры B. В вышеприведенном запросе утверждается, что он сыграл 3 игры, когда на самом деле он сыграл 2, потому что есть две разные статистики за одну игру - чант 1 час назад удалить – chunt

ответ

0

Так что просто добавьте ключевое слово DISTINCT.

SELECT PlayerID, 
COUNT(DISTINCT GameID) AS GameCount, 
AVG(Stat1) "Stat 1 Avg/Game", 
AVG(Stat2) "Stat 2 Avg/Game" 
FROM PublishedStats A 
GROUP BY PlayerID 
+0

Да ... это именно то, что иронично, я просто попробовал это, прежде чем проверять ... спасибо. – chunt

+0

Не должно быть 'SUM (Stat1)/COUNT (DISTINCT GameID)'? –

+0

Да, Маркус, вы правы, самая большая проблема заключалась в получении правильного количества игр – chunt

Смежные вопросы