Получение суммы 2 столбцов с уникальным условием - PullRequest
0 голосов
/ 20 мая 2018

У меня есть две таблицы, подобные этой.

create table teams (
  "ID" Integer NOT NULL ,
  "STADIUM_ID" Integer NOT NULL ,
  "NAME" Varchar2 (50) NOT NULL ,
    primary key ("ID") 
    ) ;

create table matches (
  "ID" Integer NOT NULL ,
  "WINNER_ID" Integer NOT NULL ,
  "OPPONENT_ID" Integer NOT NULL ,
  "WINNERSCORE" Integer,
  "OPPONENTSCORE" Integer,
primary key ("ID","WINNER_ID","OPPONENT_ID") 
) ;

У них есть следующие данные:

select * from matches;

    ID      WINNER_ID OPPONENT_ID WINNERSCORE OPPONENTSCORE
---------- ---------- ----------- ----------- -------------
     1          5           2           5             2
     2          4           5           1             0
     3          3           2           1             0
     4          3           2           1             0
     5          1           2           2             0
     6          3           1           2             1

select * from teams;

    ID     STADIUM_ID    NAME
---------- ---------- -----------
     1          1        Team1
     2          3        Team2
     3          4        Team3
     4          2        Team4
     5          5        Team5

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

select name,
       (select sum(opponentscore)
          from matches
         where opponent_id = teams.id) +
       (select sum(winnerscore) from matches where winner_id = teams.id) sum
  from teams;

NAME                                                      SUM
-------------------------------------------------- ----------
Team1                                                       3
Team2
Team3
Team4
Team5                                                       5

Есть ли у вас какие-либо предложения?

Ответы [ 5 ]

0 голосов
/ 21 мая 2018

Проблема с NULL s - подзапросы возвращают NULL, если результат не найден, и NULL + anything == NULL.

Наиболее простое исправление:

select name,
       nvl(
           (select sum(opponentscore) from matches where opponent_id = teams.id),
           0
       )
       +
       nvl(
           (select sum(winnerscore) from matches where winner_id = teams.id),
           0
       ) sum
from teams;

ДляИз соображений производительности, возможно, вы захотите использовать объединенный запрос с GROUP BY, как это было предложено другими.

0 голосов
/ 21 мая 2018

Все, что вам нужно, это рассчитать отдельно балл противника и балл победителя для каждой отдельной команды и объединить их с UNION ALL :

select name, sum(score) total_score 
  from
(
 select name, sum(winnerscore) score
   from teams t join matches m on ( t.id = m.winner_id  )
  group by name
 union all
 select name, sum(opponentscore) score
   from teams t join matches m on ( t.id = m.opponent_id  )
  group by name
)
group by name
order by 1;

Демонстрация SQL Fiddle

0 голосов
/ 20 мая 2018

Вы можете присоединиться к настольным командам дважды за матчами за столом:

SELECT name, SUM(wonMatches.WINNERSCORE + lostMatches.OPPONENTSCORE) as goals FROM (teams INNER JOIN matches as wonMatches ON teams.ID = wonMatches.WINNER_ID) INNER JOIN matches as lostMatches ON teams.ID = lostMatches.OPPONENT_ID GROUP BY name

0 голосов
/ 21 мая 2018

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

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

При этом у меня в конце были бы такие столы:

  • fan
  • team (id_team)
  • игрок (id_player, id_team)
  • турнир (id_tournament)
  • матч (id_match, id_tournament, start_on, id_team_home, id_team_visitor)
  • голов (id_match, id_player, goaled_on *)1018 *

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

0 голосов
/ 20 мая 2018

Вы должны использовать объединение и группирование по

  select name, sum(matches.opponentscore) + sum(matches.winnerscore) my_sum
  from matches 
  inner join teams on teams.id = matches.winner_id 
  group by  teams.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...