У меня есть таблица ставок и один столбец с названием «Статус», который указывает, является ли он «Правильным» или «Неверным».Я могу вычислить коэффициент для конкретного пользователя следующим образом:
SELECT
(SELECT COUNT(*) FROM bets_bet WHERE user_id = 1 AND status = 'Correct')::DECIMAL AS correct_guesses,
(SELECT COUNT(*) FROM bets_bet WHERE user_id = 1 AND status = 'Incorrect')::DECIMAL AS incorrect_guesses,
CAST((SELECT COUNT(*) FROM bets_bet WHERE user_id = 1 AND status = 'Correct') AS DECIMAL) / CAST((SELECT COUNT(*) FROM bets_bet WHERE user_id = 1 AND status = 'Incorrect') AS DECIMAL) AS Ratio;
Но если я попытаюсь сделать это группированием по пользователю, он вычислит одинаковое значение для всех них.
SELECT
user_id, accounts_usuario.username,
(SELECT COUNT (*) FROM bets_bet WHERE status = 'Correct') AS Corrects,
(SELECT COUNT (*) FROM bets_bet WHERE status = 'Incorrect') AS Incorrects,
(SELECT COUNT (*) FROM bets_bet WHERE status = 'Pending') AS Pending,
--CAST(COUNT(*) AS DECIMAL) / CAST((SELECT COUNT(*) FROM bets_bet) AS DECIMAL) AS Ratio
CAST((SELECT COUNT(*) FROM bets_bet WHERE status = 'Correct') AS DECIMAL) / CAST((SELECT COUNT(*) FROM bets_bet WHERE status = 'Incorrect') AS DECIMAL) AS Ratio
FROM bets_bet
LEFT JOIN accounts_usuario ON bets_bet.user_id = accounts_usuario.id
GROUP BY user_id, accounts_usuario.username
ORDER BY Ratio, Corrects;
Как мне достичь желаемого результата?
Обновление
У меня такое жепроблема после реализации следующей логики:
Я создал класс SeasonalUser для хранения ставок каждого года, а поле user - это внешний ключ для идентификатора класса User.Так что теперь у меня та же логика, но с 3 таблицами, и я снова получаю одно и то же значение для каждого поля.
-- Calculate the accuracy ratio for every SeasonUser
SELECT
bet.user_id, usr.username,
COUNT(CASE WHEN status = 'Correct' THEN 1 END) AS Corrects,
COUNT(CASE WHEN status = 'Incorrect' THEN 1 END) AS Incorrects,
COUNT(CASE WHEN status = 'Pending' THEN 1 END) AS Pending,
CAST(COUNT(CASE WHEN status = 'Correct' THEN 1 END) AS DECIMAL) / CAST(COUNT(CASE WHEN status = 'Incorrect' THEN 1 END) AS DECIMAL) AS Ratio
FROM bets_bet AS bet
LEFT JOIN accounts_seasonusuario AS s_usr ON bet.user_id = s_usr.id
LEFT JOIN accounts_usuario AS usr ON usr.id = s_usr.user_id
GROUP BY bet.user_id, s_usr.id, usr.username
ORDER BY Ratio DESC, Corrects DESC;
Я не хочу группировать по usr.username (пользовательский глобальный), потому чтоЯ хочу соотношение в год, но, похоже, оно обязательно, если я хочу напечатать реальное имя пользователя в возвращаемой таблице usr.username
.
Чего мне не хватает?