#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 )