2011-12-29 17 views
0

私はこのSQL集計クエリエラー

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

のような3つのテーブルを持っている私はTEAMINFOを選択したい名前、スポンサー、totalplayer、totalchampion、上司、 選手の平均年齢は、ALLSTAR選手の数を含めます

私は

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 

次のようにT-SQLを記述したが、それは動作しません、エラーメッセージが

です

'集計関数またはGROUP BY句に含まれている ではないため、' Team.Name '列は選択リストで無効です。'

誰が私を助けることができますか? Thxで事前に!

+0

何フィールドの種類はplayerdetail.allstarですか?プレーヤがオールスターでない場合はNULLでない限り、チームのオールスターの数ではなく、(ヌル以外の)playerdetailレコードの数が返されます。 –

答えて

3

は(あなたのためを推測しますのMySQLを除く)ほとんどのRDBMSでは

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

を追加し、列また

BY(AVGCOUNT)集計またはGROUPのいずれかでなければなりません明示的な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()を使ってallstarsの総数を計算できます。あなたのt - SQLはうまく動作します。ありがとう!私のオリジナルのt-sqlは、あなたのものと同じですが、グループ・バイ・ステートメントを除いて、あなたは私がなぜステートメントでグループを追加しなければならないのか教えていただけますか? – James

+0

@AI_Bryant: "ほとんどのRDBMS(あなたを推測するMySQLを除く)では、列は集計(COUNT、AVG)またはGROUP BYでなければなりません" – gbn

0

使用です:あなたはチームごとに、このデータをしたい、とteam.IDは一意にチームを識別し、私は次のことを提案していることを考えると

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

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中毒の開発者の回避策? :)実際には、私はそれが好きですが、私はそれを使用することはほとんどないと確信しています。 –

+0

?回避策であると思われるビット、または特にMySQLについて言及する理由はわかりません.MAXを使用していない限り(MySQLに集約関数を必要としない場合) SQLクエリを理解しようとすると、冗長なグループ分けが混乱することがわかりました。 –

+0

はい、私は彼らのPKがGROUP BY句にあるので、変更される予定のない列のMAXesについて話していました。私はあなたの心配を見ますが、この集約の豊富さは私にほとんど混乱しないように見えます。もしあなたがそれに慣れていれば、大丈夫です。私は 'Player left join PlayerDetail'を別々に集計し、結果セットを' Team'に参加させます。 –