SQL-запрос не будет выполняться из-за странной группы по ошибке

#python #sql #pgadmin-4

Вопрос:

Я написал этот SQL-запрос в интерфейсе python, используя SQL-сервер pgAdmin4.

Предполагается, что он возвращает упорядоченное значение (по убыванию суммы и, если равно, по возрастанию по идентификатору стадиона), где сумма-это количество голов, забитых на стадионе. если на стадионе не было ни одного матча, сумма должна быть равна 0.

В игровом столе есть запись всех матчей, на каком стадионе они происходили и сколько людей было в толпе

В таблице стадиона указан номер стадиона, вместимость и команда, которой он принадлежит

В таблице результатов указан матч, в котором был забит гол, игрок, который забил, и сколько голов он забил

База данных:

Игра стадион счет

 query = sql.SQL("  SELECT T.Stadiumid AS Stadiumid, T.SUM(Amount) AS Sum   FROM(  (SELECT game.Stadiumid AS Stadiumid,SUM(Amount) AS Sum   FROM game,score   WHERE (game.Matchid=score.Matchid)   )  UNION   (SELECT stadium.Stadiumid AS unplayedStadiumid,0 AS unplayedSum  FROM stadium   WHERE (stadium.Stadiumid NOT IN (SELECT game.Stadiumid FROM game))  )  ) AS T   GROUP BY T.Stadiumid  ORDER BY T.Sum DESC,T.Stadiumid  ")  

При выполнении запроса я получаю следующее сообщение об ошибке:

 column "game.stadiumid" must appear in the GROUP BY clause or be used in an aggregate function  LINE 1: ...d AS Stadiumid, T.SUM(Amount) AS Sum FROM((SELECT game.Stadi...  

В чем, по-видимому, проблема?

Комментарии:

1. Я предполагаю, что вам нужна GROUP BY оговорка в первом ВЫБОРЕ вашего FROM заявления

Ответ №1:

Я полагаю GROUP BY , что в вашем первом внутреннем выборе чего-то не хватает. Там вы ищете SUM(Amount) , но не указываете , по каким переменным его следует суммировать.

Если вы хотите суммировать все game.Stadiumid , то этот код работает для вашей первой части Объединения:

 SELECT game.Stadiumid AS Stadiumid,SUM(Amount) AS Sum   FROM game,score   WHERE (game.Matchid=score.Matchid)  GROUP BY game.Stadiumid  

Комментарии:

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

2. game Таблица содержит все уникальные stadiumid stadium данные, содержащиеся в таблице. Вот почему ваше условие NOT IN (SELECT game.Stadiumid FROM game) делает недействительными все выбранные строки, и вы получаете пустую таблицу.

Ответ №2:

Вы пропустили группировку по в этом подзапросе

 (SELECT game.Stadiumid AS Stadiumid,SUM(Amount) AS Sum  FROM game,score  WHERE (game.Matchid=score.Matchid)  GROUP BY game.Stadiumid -- missing group by )