Объединение SQL-запросов с различными причинами WHERE

#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. Спасибо, теперь это имеет гораздо больше смысла. Я имел в виду два столбца, да 🙂