1

キャプテンであり、ペナルティに対して合計£80以上を支払ったプレーヤーのペナルティで支払われたプレーヤー番号と合計金額を取得するSQLクエリを作成する必要がある割り当てがあります。

私は3つのテーブルを持っています

プレーヤー(playerNo、名前、イニシャル、通り、町、郵便番号)

チーム(teamNo、playerNo、division)

ペナルティ(paymentNo、playerNo、penDate、amount)

太字のテキストは主キーを示します。チームテーブルのplayerNoは、チームキャプテンを示します。

3つのテーブルを結合する方法がわかりません。しかし、これに対する私の試みは次のとおりです。

SELECT p1.playerNo, SUM(p2.amount)
FROM Players p1 INNER JOIN Teams t
   ON p1.playerNo = t.playerNo 
JOIN penalties p2
   ON p2.playerNo = p1.playerNo
GROUP BY playerNo
HAVING SUM(p2.amount) > 80;

これは正しいですか?

4

4 に答える 4

4
SELECT a.playerNo, a.playerName, SUM(c.amount) as amount, b.teamNo as Team
FROM players a, teams b, penalties c
WHERE a.playerNo = b.playerNo and a.playerNo = c.playerNo
Group By a.playerNo, c.teamNo
Having sum....
于 2012-05-17T19:18:00.187 に答える
1

あなたのクエリはあなたが望むものを返すために正しいように見えます。同じプレーヤーが複数のチームのキャプテンである場合はどうすればよいかという疑問が生じますが、それはおそらく起こりません。

データベース構造についてコメントが必要ですか?

于 2012-05-17T18:54:41.410 に答える
0

プレーヤーが複数のチームのキャプテンになることができない場合、はい、あなたの質問は正しいです。GROUP BY playerNoに置き換えるだけですGROUP BY p1.playerNo

ただし、プレーヤーが複数のチームのキャプテンになることができる場合、間違った結果が返されます。これにより、どのような場合でも正しい答えが得られます。

SELECT p1.playerNo, SUM(p2.amount)
FROM Players p1 
  JOIN penalties p2
    ON p2.playerNo = p1.playerNo
WHERE EXISTS
      ( SELECT *
        FROM Teams t
        WHERE p1.playerNo = t.playerNo
      ) 
GROUP BY p1.playerNo
HAVING SUM(p2.amount) > 80;
于 2012-05-17T21:25:46.800 に答える
0
select captaion_number , sum (amount) total_amount 
from (select t.playes.no   captaion_number , p.amount   amount 
from teams t ,  Penalties p
 where t.player_no = p.player_no ) 
group by captaion_number 
having total_amount > 80 ;
于 2013-03-13T12:15:55.837 に答える