Ошибка агрегатного запроса SQL - PullRequest
0 голосов
/ 29 декабря 2011

У меня есть 3 таблицы, как это

player(id,name,age,teamid)
team(id,name,sponsor,totalplayer,totalchampion,boss,joindate)
playerdetail(id,playerid,position,number,allstar,joindate)

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

Я пишу t-sql, как показано ниже

SELECT T.NAME,T.SPONSOR,T.TOTALPLAYER,T.TOTALCHAMPION,T.BOSS,T.JOINDATE,
AVG(P.AGE) AS AverageAge,COUNT(D.ALLSTAR) As AllStarPlayer
FROM Team T,Player P,PlayerDetail D 
WHERE T.ID=P.TID AND P.ID=D.PID

но это не работает, сообщение об ошибке

'Колонка' Team.Name 'недопустима в списке выбора, потому что это не содержится либо в статистической функции, либо в предложении GROUP BY. '

Кто может мне помочь? Спасибо заранее!

Ответы [ 3 ]

3 голосов
/ 29 декабря 2011

Добавить

GROUP BY 
      T.NAME,T.SPONSOR,T.TOTALPLAYER,T.TOTALCHAMPION,T.BOSS,T.JOINDATE

В большинстве СУБД (кроме MySQL, которая будет угадывать для вас), столбец должен быть либо агрегированным (COUNT, AVG), либо в GROUP BY

Кроме того, вы должны использовать явные соединения.
Это понятнее, менее двусмысленно и труднее запутать ваш код

SELECT 
    T.NAME, T.SPONSOR, T.TOTALPLAYER, T.TOTALCHAMPION, T.BOSS, T.JOINDATE,
    AVG(P.AGE) AS AverageAge,
    COUNT(D.ALLSTAR) As AllStarPlayer
FROM 
    Team T
    JOIN
    Player P ON T.ID=P.TID
    JOIN
    PlayerDetail D  ON P.ID=D.PID
GROUP BY 
    T.NAME, T.SPONSOR, T.TOTALPLAYER, T.TOTALCHAMPION, T.BOSS, T.JOINDATE;
1 голос
/ 29 декабря 2011

Если вам нужны эти данные для каждой команды, а team.ID однозначно определяет команду, я предлагаю следующее:

SELECT max(T.NAME) As TeamName,
       max(T.SPONSOR) As Sponsor,
       max(T.TOTALPLAYER) As TotalPlayers,
       max(T.TOTALCHAMPION) As TotalChampions,
       max(T.BOSS) As Boss,
       max(T.JOINDATE) As JoinDate,
       AVG(P.AGE) AS AverageAge,
       COUNT(D.PID) As AllStarPlayer
FROM Team T
join Player P on T.ID=P.TID 
left join PlayerDetail D on P.ID=D.PID and D.ALLSTAR = 'Y'
group by T.ID
0 голосов
/ 29 декабря 2011

Использование:

SELECT T.NAME,T.SPONSOR,T.TOTALPLAYER,T.TOTALCHAMPION,T.BOSS,T.JOINDATE,
AVG(P.AGE) AS AverageAge,COUNT(D.ALLSTAR) As AllStarPlayer
FROM Team T
JOIN Player P ON T.ID = P.TEAMID
JOIN PlayerDetail D ON P.ID = D.PLAYERID
GROUP BY T.NAME,T.SPONSOR,T.TOTALPLAYER,T.TOTALCHAMPION,T.BOSS,T.JOINDATE
...