2016-06-01 5 views
2

У меня есть таблица, в которой перечислены результаты по видам спорта, датам начала и окончания и результату победы/поражения. Мне нужно рассчитать процент выигрышей за спорт за сезон_старт. Это мой стол:Как рассчитать проценты в tsql, используя группу по запросу?

table1 
****** 
id sport won playerid  season_start season_end updated_date 
--- ----- ---- --------  ------------ ------------ ------------ 
1  rugby Y kato23  2016-01-01  2016-01-31 2016-02-01 
2  rugby Y king54  2016-01-01  2016-01-31 2016-02-01 
3  rugby N robby1  2016-03-01  2016-03-28 2016-04-01 
4  rugby Y kelly2  2016-03-01  2016-03-28 2016-04-01 
5  soccer Y kato23  2016-01-01  2016-01-31 2016-02-01 
6  soccer Y jeri44  2016-01-01  2016-01-31 2016-02-01 
7  soccer N matt24  2016-06-01  2016-06-30 2016-07-01 
8  tennis Y kray43  2016-01-01  2016-01-31 2016-02-01 
9  tennis Y jeri44  2016-01-01  2016-01-31 2016-02-01 
10 tennis N jeri44  2016-01-01  2016-01-31 2016-02-01 

Так что я хотел бы выполнить запрос, который производит следующий результат:

sport  season_start  success_percent 
-----  ------------  --------------- 
rugby  2016-01-01  100.00 
rugby  2016-03-01  50.00 
soccer 2016-01-01  100.00 
soccer 2016-06-01  0.00 
tennis 2016-01-01  66.66 

Я попытался:

select sport,won, season_start, count(sport) as sportcount 
from table1 where won = 'Y' 
group by sport, won, season_start 

Но это просто дать мне полный счет, но не фактический процент успеха. Я пробовал использовать регистр case, но я не слишком хорош с tsql или с помощью «Sum», чтобы подсчитать выигрыши и потери, а затем вычислить процент выигрыша из общего числа.

Может ли кто-нибудь предоставить запрос tsql, который делает это?

ответ

1

Вы можете использовать условные отсчеты для этого:

select sport, season_start, 
     sportcount = count(case when won = 'Y' then 'X' end) * 100.0/count(*) 
    from table1 
group by sport, season_start 
+0

, который не выглядит правильным - теперь он дает мне 100 или 0, что неверно –

+0

Извинения, моя ошибка - я тоже сгруппировал выигранный, поэтому он был испорчен! Держитесь, позвольте мне проверить, скоро вас обновит. –

+0

OK У меня проблема: мне нужно включить update_date как один из столбцов в результирующем наборе, но затем, когда я добавляю update_date в select и в группе, результат выключен - он также вставляет дополнительные строки , Как добавить столбец updated_date в результирующий набор, не запуская набор результатов? –

1

Пожалуйста, попробуйте следующий запрос:

SELECT sport, season_start, 
     (CAST(COUNT(CASE won WHEN 'Y' THEN '1' ELSE NULL END) AS DECIMAL(10,2)))/CAST(COUNT(*) AS DECIMAL(10,2)))*100 AS sportcount 
FROM table1 
GROUP BY sport, season_start 

На самом деле внутри функции COUNT совокупности мы проверяем значение выиграл колонку и если он равен «Y», мы будем считать это иначе, мы будем его игнорировать. Как вы знаете, функция агрегации Count игнорирует значения NULL, поэтому внутри Count, если выиграно не равно «Y», мы создаем значение NULL, которое заставит Count игнорировать его. После того, как мы подсчитали количество выигранных очков, нам просто нужно разделить его на общее количество матчей за спорт и сезон (Count (*) посчитает это).

Вы разместили выигранное в группе, что вызовет проблему. Каждая запись с одинаковыми группами будет представлена ​​в результирующем наборе только один раз. Если вам нужно выиграть в своем списке выбора, вы можете попробовать использовать функции CROSS APPLY или Window Aggregate. Если вам это нужно, обновите свой вопрос, и после этого я буду обновлять свой ответ на его основе.

Обратите внимание, что для получения точного результата вам может потребоваться CAST или CONVERT часть вычисления процента для десятичных или числовых данных и т. Д. (Вот почему я наложил оба значения на DECIMAL)

+0

Вы комментарий на месте! Я сделал конверт для преобразования в десятичный. Что касается учета NULL, выигрышная колонка никогда не будет иметь нулевое значение, поэтому мы рассмотрим это.Я пойду вперед и дам вам точку в ответе, но не знаю, как это сделать. –

+0

@ DamonMatt Просто нажмите «Стрелка вверх» рядом с моим ответом, если вы сочтете это полезным –

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