2011-12-29 126 views
0

我有3代表這樣SQL彙總查詢錯誤

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

我想選擇teaminfo包括姓名,贊助商,totalplayer,totalchampion,老闆, 球員的平均年齡,ALLSTAR玩家人數

我寫的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 

,但它不工作,該錯誤信息是

'Column'Team.Name'在選擇列表中無效,因爲它不是包含在集合函數或GROUP BY子句中的 。

誰能幫幫我? Thx提前!

+0

什麼有些領域是playerdetail.allstar?除非玩家不是全明星,否則它會返回NULL,這將返回(非null)playerdetail記錄的數量,而不是團隊中有多少allstars。 – 2011-12-29 10:49:51

回答

3

添加

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

在大多數RDBMS(除了MySQL的將猜測你),列必須是要麼彙總(COUNTAVG),或在GROUP BY

而且,你應該使用顯式的JOIN。
這是clearer, less ambiguous and more difficult to bollix your code

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; 
+0

嗨,gbn,我的全明星是位型的,所以當玩家不是全明星時,值爲0,我想我可以用count()來計算所有星星的總數。你的t-sql運行良好。謝謝!我的原始t-sql和你的一樣,除非沒有group by語句,你能告訴我爲什麼我必須添加group by語句嗎? – James 2011-12-30 07:19:49

+0

@AI_Bryant:「在大多數關係型數據庫管理系統中(除了你猜測的MySQL外),一列必須是聚合的(COUNT,AVG)或GROUP BY」 – gbn 2011-12-30 07:32:11

0

用途:

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 
1

既然你想每隊這個數據,並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

解決MySQL上癮的開發者的解決方案? :)其實,我喜歡它,但我幾乎可以確定我永遠不會使用它。 – 2011-12-29 12:01:52

+0

?不知道你認爲哪一點是解決方法,或者你爲什麼特別提到MySQL ......除非它是使用MAX(你不需要MySQL中的集合函數)?在嘗試理解SQL查詢時,我發現冗餘分組會造成混亂。 – 2011-12-29 12:20:47

+0

是的,我正在談論MAXes,因爲它們的PK在GROUP BY子句中,所以不應該改變這些列。我看到你的擔憂,但這種聚合的豐富性看起來幾乎讓我感到困惑。我的意思是,如果你習慣了,很好。不過,我會分別聚合'Player left join PlayerDetail',然後將結果集加入到'Team'中。 – 2011-12-29 12:49:16