#sql
#sql
Вопрос:
Я написал базу данных со статистикой игр, в которой указаны победитель, проигравший и выигранные деньги. Сейчас я пытаюсь составить статистику для этого.
Я пытаюсь составить статистику для этих игр и т. Д. Количество побед / поражений для игрока, потерянные и выигранные деньги.
До сих пор я нашел три запроса для достижения этой цели.
SELECT COUNT(winner) AS wins, COUNT(loser) AS losses
FROM coinflipper_games
WHERE winner = "dba92393-5bbd-365f-8fe7-55be2707caf3"
OR loser = "dba92393-5bbd-365f-8fe7-55be2707caf3"
SELECT SUM(money)
FROM coinflipper_games
WHERE winner = "dba92393-5bbd-365f-8fe7-55be2707caf3"
SELECT SUM(money)
FROM coinflipper_games
WHERE loser = "dba92393-5bbd-365f-8fe7-55be2707caf3"
Проблема в том, что использование трех запросов никоим образом не эффективно, поэтому я пытаюсь свести это к одному. У кого-нибудь есть идеи, что я могу сделать?
Ответ №1:
Используйте условную агрегацию:
SELECT COUNT(winner) AS wins, COUNT(loser) AS losses,
SUM(CASE WHEN winner = 'dba92393-5bbd-365f-8fe7-55be2707caf3' THEN money ELSE 0 END) as winnings,
SUM(CASE WHEN loser = 'dba92393-5bbd-365f-8fe7-55be2707caf3' THEN money ELSE 0 END) as losings
FROM coinflipper_games
WHERE 'dba92393-5bbd-365f-8fe7-55be2707caf3' IN (winner, loser);
Обратите внимание, что я заменил двойные кавычки одинарными кавычками. Одинарные кавычки являются стандартом SQL для разделителей строк. Это также упрощает WHERE
предложение.
Примечание:
Приведенное выше повторяет запросы, которые у вас есть в вопросе. Вероятно, вы на самом деле намерены подсчитывать победителей и проигравших, а также суммы. Это было бы:
SELECT SUM(CASE WHEN winner = 'dba92393-5bbd-365f-8fe7-55be2707caf3' THEN 1 ELSE 0 END) as wins,
SUM(CASE WHEN loser = 'dba92393-5bbd-365f-8fe7-55be2707caf3' THEN 1 ELSE 0 END) as losses,
SUM(CASE WHEN winner = 'dba92393-5bbd-365f-8fe7-55be2707caf3' THEN money ELSE 0 END) as winnings,
SUM(CASE WHEN loser = 'dba92393-5bbd-365f-8fe7-55be2707caf3' THEN money ELSE 0 END) as losings
FROM coinflipper_games
WHERE 'dba92393-5bbd-365f-8fe7-55be2707caf3' IN (winner, loser);
Комментарии:
1. Спасибо 🙂 Никогда не понимал, как использовать CASE, это имеет такой смысл.
Ответ №2:
Используйте условную агрегацию следующим образом:
SELECT SUM(case when winner='dba92393-5bbd-365f-8fe7-55be2707caf3' then 1 else 0 end) AS wins,
SUM(case when loser='dba92393-5bbd-365f-8fe7-55be2707caf3' then 1 else 0 end) AS losses,
SUM(CASE WHEN winner = 'dba92393-5bbd-365f-8fe7-55be2707caf3' THEN money ELSE 0 END) as winnings,
SUM(CASE WHEN loser = 'dba92393-5bbd-365f-8fe7-55be2707caf3' THEN money ELSE 0 END) as losings
FROM coinflipper_games
WHERE winner='dba92393-5bbd-365f-8fe7-55be2707caf3'
OR loser='dba92393-5bbd-365f-8fe7-55be2707caf3'
Комментарии:
1. Спасибо, теперь это имеет гораздо больше смысла 🙂
Ответ №3:
Вы можете сделать это с помощью условной агрегации:
SELECT
SUM(winner = 'dba92393-5bbd-365f-8fe7-55be2707caf3') AS wins,
SUM(loser = 'dba92393-5bbd-365f-8fe7-55be2707caf3') AS losses,
SUM(money * CASE WHEN winner = 'dba92393-5bbd-365f-8fe7-55be2707caf3' THEN 1 ELSE -1 END) AS total_money
FROM coinflipper_games
WHERE 'dba92393-5bbd-365f-8fe7-55be2707caf3' IN (winner, loser)
Приведенный выше запрос вернет 1 столбец для общей money
суммы, которую пользователь выиграл или проиграл.
Если вам нужны 2 разных столбца:
SELECT
SUM(winner = 'dba92393-5bbd-365f-8fe7-55be2707caf3') AS wins,
SUM(loser = 'dba92393-5bbd-365f-8fe7-55be2707caf3') AS losses,
SUM(CASE WHEN winner = 'dba92393-5bbd-365f-8fe7-55be2707caf3' THEN money ELSE 0 END) AS money_won,
SUM(CASE WHEN loser = 'dba92393-5bbd-365f-8fe7-55be2707caf3' THEN money ELSE 0 END) AS money_lost
FROM coinflipper_games
WHERE 'dba92393-5bbd-365f-8fe7-55be2707caf3' IN (winner, loser)
Смотрите демонстрацию.
Комментарии:
1. Спасибо, теперь это имеет гораздо больше смысла. Я имел в виду два столбца, да 🙂