Сравнить два значения в строках по ключу, а затем условно добавить что-то в таблицу? - PullRequest
1 голос
/ 23 октября 2019

В тот момент в классах мы изучали только простые операции выбора, внутренние объединения, ввод данных в таблицы и т. Д. Но теперь мне нужно выполнить некоторую сложную функцию.

У меня есть база данных футбольных матчей. У меня есть таблица соответствий:

ID; ID_Country_1; Id_Country_2; Date; Group

И с помощью Stackoverflow теперь у меня есть вторая таблица целей:

ID; Group; Country; Date; Goals

Например, вот такие строки:

1; Russia; Canada; date; A
1; A; Russia; date; 0 goals
1; A; Canada; date; 3 goals

И я хочу пойти по одному идентификатору (например, 1) и сравнить, кто забил больше голов, а затем, зная эту информацию, создать новую таблицу с очками (3 для w и т.д.). Я сделал таблицу, когда у меня есть:

Country1 - Contry2; Score1-Score2; 

Но потом понял, что это совершенно бесполезно, и теперь я должен разобрать материал, и отверг эту идею. Например, я понятия не имею, как это сделать, что я должен использовать, может, что я должен прочитать или проверить, или, может быть, некоторые примеры, которые вы можете иметь, не привязывая это к коду, просто в общем, как организовать мои выборки ии т.д. PS: это SQL 17 и SMSS. Требуемый вывод что-то вроде этого:

IDCountry; Points; (Maybe) Goals in general
IDCountry; Points; (Maybe) Goals in general
Example:
Russia; 4; 4;
Canada; 6; 3

Примечание: у меня много строк с играми, поэтому не просто выберите top (1), это для всех строк. Также извините за мой плохой английский :) Буду признателен, если кто-то просто напишет общий пример для подобных случаев, и я буду встраивать его в свою базу данных во время поиска в Google

1 Ответ

1 голос
/ 23 октября 2019

Я попытаюсь начать с одной идеи / метода:

Вы можете присоединить таблицу целей к себе, чтобы вы могли указать победителя / проигравшего непроверенный

select g1.ID as Match, g1.Country,
   case when g1.goals > g2.goals then 3  -- this case statement will get you the points for win/tie/loss
        when g1.goals = g2.goals then 1  -- tie
        else 0  -- loss
   end AS PointsFromThisMatch,
   g1.goals as GoalsInThisMatch
from goals g1 -- The goals table, this will be the target of the points
inner join goals g2 -- The goals table again, this will be the opponent to determine win/lose/tie
   on g1.ID = g2.ID -- The same match
   and g1.country <> g2.country -- avoid joining a row to itself

Это должно возвращать очки и голы для каждой команды за каждый матч. Затем эти результаты могут быть суммированы для каждой команды:

select t1.Country, sum(PointsFromThisMatch) TotalPoints,
   sum(GoalsInThisMatch) TotalGoalsScored
from (
   select g1.ID as Match, g1.Country,
      case when g1.goals > g2.goals then 3
           when g1.goals = g2.goals then 1
           else 0
      end AS PointsFromThisMatch,
      g1.goals as GoalsInThisMatch
   from goals g1
   inner join goals g2
      on g1.ID = g2.ID
      and g1.country <> g2.country
) t1
group by t1.Country
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...