【问题标题】:Select the number of English players from team which scored the most goals at home on a match从在一场比赛中主场进球最多的球队中选择英格兰球员的人数
【发布时间】:2022-01-07 12:25:05
【问题描述】:

团队

ID TEAM_NAME
1 Arsenal

比赛

ID DATE HOME_TEAM_ID AWAY_TEAM_ID HOME_SCORE AWAY_SCORE
1 2018-08-10 10 7 2 1

国家

ID NATION_NAME
1 Spain

玩家

ID NAME NATION_ID TEAM_ID
100 David de Gea 1 10

目标

GOAL_ID MATCH_ID PLAYER_ID GOAL_ORDER OWN_GOAL
1 1 106 1 False

我试图从上面的数据库(SQL Server)中计算出主场进球最多的球队的英格兰球员人数。

我的查询:

SELECT TOP 1 COUNT(PLAYER.PLAYER_ID), MAX(HOME_SCORE)
FROM PLAYER 
JOIN NATION ON PLAYER.NATION_ID = NATION.NATION_ID
JOIN MATCH ON MATCH.HOME_TEAM_ID = PLAYER.TEAM_ID
WHERE NATION.NATION_NAME = 'England'
GROUP BY PLAYER.PLAYER_ID
ORDER BY MAX(MATCH.HOME_SCORE) DESC

它给出了max(home_score) 的正确答案,但该队的英国球员人数不正确。

【问题讨论】:

  • 请提供minimal reproducible example,包括样本数据和所需结果。 (问题需要独立,不需要外部链接才能完成)。
  • 不要混合使用隐式连接语法 match, player (近 30 年前已经过时,使用 ANSI92),与显式连接语法 player JOIN nation ON...。相反,在matchplayer 之间使用JOIN 关键字,然后指定该联接的条件。 (目前,无论该玩家是否参与了那场比赛,您都加入了每一场比赛。)
  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。
  • edit 任何新信息直接进入您的问题。
  • 我强烈推荐表别名以避免在每次引用中都输入整个表名。

标签: sql sql-server tsql


【解决方案1】:

只是未经测试的记事本涂鸦。
因为没有样本数据我无法验证。

SELECT TOP 1
  match.match_id
, match.home_score
, COUNT(CASE 
        WHEN player_nation.nation_name = 'England'
        THEN player.player_id
        END) AS EnglishPlayers
, COUNT(goal.goal_id) AS TotalGoals
FROM GOAL AS goal
JOIN PLAYER AS player 
  ON player.player_id = goal.player_id
JOIN MATCH AS match 
  ON match.match_id = goal.match_id
 AND match.home_team_id = player.team_id
LEFT JOIN NATION AS player_nation 
  ON player_nation.nation_id = player.nation_id
GROUP BY match.match_id
ORDER BY TotalGoals DESC

【讨论】:

    【解决方案2】:

    你需要先获得得分最高的团队,然后左加入NATIONPLAYER,然后统计非空NATION_ID的数量。

    您还按错误的值分组

    SELECT TOP (1)
      p.TEAM_ID,
      NumPlayers = COUNT(*),
      NumEnglishPlayers = COUNT(n.NATION_ID),
      HighestScore = m.HOME_SCORE
    FROM (
        SELECT TOP (1) *
        FROM MATCH m
        ORDER BY
          m.HOME_SCORE DESC
    ) m
    JOIN PLAYER p ON m.HOME_TEAM_ID = p.TEAM_ID
    LEFT JOIN NATION n ON p.NATION_ID = n.NATION_ID
        AND n.NATION_NAME = 'England'
    GROUP BY
      m.HOME_TEAM_ID,
      m.HOME_SCORE;
    

    db<>fiddle

    【讨论】:

    • 它没有给出正确答案,它显示 95 NumPlayers 和 95 NumEnglishPlayers
    • 由于您没有提供示例数据,我无法真正测试它,但我已经切换了连接,所以它现在应该可以工作了
    • 添加样本数据,得到以下结果:9 456 95 6
    • OK 已修改,我得到10,1,0,2 和您的样本数据dbfiddle.uk/…
    • 谢谢,它有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    相关资源
    最近更新 更多