Получить среднее значение в определенном диапазоне

Для начала у меня есть база данных, основанная на ставках на спорт. У меня есть одна таблица под названием «MATCHES» (id_match/sport_id/League_id/team/quota/result).

Представим, что у нас в таблице есть следующие значения:

id_match | sport_id | League_id | team | quota | result
---------------------------------------------------------
   1     |    x     |  xx       | xx   |  1.4  |  W
---------------------------------------------------------
   2     |    x     |  xx       | xx   |  2.4  |  W
---------------------------------------------------------
   3     |    x     |  xx       | xx   |  2.2  |  L
---------------------------------------------------------
   4     |    x     |  xx       | xx   |  2.35 |  W
---------------------------------------------------------

Я хочу извлечь процент успеха квот, сгруппированных по определенному диапазону, поэтому я использую следующий запрос:

SELECT  AVG(IF(bet_matches.quota BETWEEN 1.01 and 1.24 and bet_matches.result='W', 100, 0)) as '1 - 1.25' ,
    AVG(IF(bet_matches.quota BETWEEN 1.25 and 1.49 and bet_matches.result='W', 100, 0)) as '1.25 - 1.50' ,
    AVG(IF(bet_matches.quota BETWEEN 1.50 and 1.74 and bet_matches.result='W', 100, 0)) as '1.50 - 1.75' ,
    AVG(IF(bet_matches.quota BETWEEN 1.75 and 1.99 and bet_matches.result='W', 100, 0)) as '1.75 - 2' ,
    AVG(IF(bet_matches.quota BETWEEN 2 and 2.49 and bet_matches.result='W', 100, 0)) as '2 - 2.50' ,
    AVG(IF(bet_matches.quota BETWEEN 2.5 and 2.99 and bet_matches.result='W', 100, 0)) as '2.50 - 3' ,
    AVG(IF(bet_matches.quota BETWEEN 3 and 4 and bet_matches.result='W', 100, 0)) as '3 - 4' ,
    AVG(IF(bet_matches.quota >3.99 and bet_matches.result='W', 100, 0)) as '4 - x' 
FROM bet_matches

Проблема возникает, когда винрейт квот не отражается должным образом в результатах. Винрейт каждого диапазона отображается неправильно. Вот результаты, которые я получаю:

1 - 1.5 | 2 - 2.5 | 
-------------------
  25%   |   50%

И это результаты, которые я хочу получить:

 1 - 1.5 | 2 - 2.5 | 
-------------------
  100%   |   66%

Любая идея, как получить эти результаты? Заранее спасибо.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы хотите:

SELECT  AVG( CASE WHEN bet_matches.quota NOT BETWEEN 1.01 and 1.24 THEN NULL
                  WHEN bet_matches.result = 'W' THEN 100.0
                  ELSE 0
             END) as `1 - 1.25`,
        AVG( CASE WHEN bet_matches.quota NOT BETWEEN 1.25 and 1.49 THEN NULL
                  WHEN bet_matches.result = 'W' THEN 100.0
                  ELSE 0
             END) as `11.25 - 1.50`,
      . . .
FROM bet_matches;

Суть в том, что вы подсчитываете все строк для среднего значения. Вы просто хотите взять пропорцию на основе условия диапазона.

Обратите внимание, что я заменил IF() на стандартный CASE. И используйте обратные кавычки для имен столбцов. Не используйте одинарные кавычки для идентификаторов. Их легко спутать со строками.

Другие вопросы по теме