Nove的SQL只是试图混淆和学习。
我创建了一个包含已删除足球数据的数据库。我有一个表格,其中包含游戏中的每个动作(角落,目标等)以及有关此动作的各种细节(时间,参与的玩家)。我正在尝试编写一个SQL,它将计算出团队得分和承认的平均目标数。我的SQL语句仅在有目标时才有效。有些游戏团队不会得分或不会让步,然后行动栏中就没有“目标”项目。
例如,对于已经打了5场比赛并且打进4球,2球,0球,0球和1球的A队。当它应该是7/5时,它会将平均值计算为7/3,因为它没有看到没有目标的游戏。
还有另一张桌子,其中包含每场比赛的game_id和所涉及的球队,因此我尝试使用它来指定每场比赛,而不仅仅是实际发生动作的比赛。它没有用,所以我决定发帖。
def averageFor(team_id, action):
cur.execute("""SELECT count(espn.actions.action_name)/count(DISTINCT espn.game_details.game_id)
FROM espn.game_details
INNER JOIN espn.actions
ON espn.game_details.game_id = espn.actions.game_id
WHERE (home_team = (%s) OR away_team = (%s))
AND action_name = (%s)
AND espn.actions.team_id = (%s)""", (team_id, team_id, action, team_id))
data = cur.fetchall()
return data
在这个SQL中,team_id是我们正在研究的团队的id号,而action是我们正在考虑的行动。 Actions是包含操作的表(每个操作1行),game_details是包含每个游戏信息的表。
我希望这是可以理解的,请原谅我可能的愚蠢,因为我是初学者。
EDIT ///
以下是要求的信息
Actions:
action_id - Primary key
game_id
action name - eg 'Goal', 'Sub'
team_id - ID of the team the action is attributed to
time - an int representing the time of the match that it happened
player_1 - ID of player involved in action
player_2 - ID of player involved in action if there was one
game_details:
game_id
home_team - ID of home team
away_team
我需要做的是获取特定团队所玩的所有game_ids。然后我希望能够计算得分的平均进球数(包括他们在计算中未得分的比赛)
答案 0 :(得分:1)
这样的东西?
SELECT AVG(
SELECT COUNT(*) as goal_count
FROM Actions
JOIN game_details ON Actions.game_id=game_details.game_id
WHERE [action name] = 'goal' GROUP BY actions.team_id
)
答案 1 :(得分:1)
通过查询获得所选团队为每个游戏打进的目标数量是一个简单的组:
SELECT game_id, COUNT(*) as goals FROM actions
WHERE team_id = 1 AND action_name = 'goal'
GROUP BY game_id;
这个行集没有任何没有目标的游戏记录,但是您可以将其加入game_id到game_details表,其中所选团队的每一行都在主页或离开列中。
左连接意味着您将从左表中获得满足WHERE
条件的每一行,并且对于每个行,如果匹配ON
条件,您将获得目标数,如果存在则为NULL不是。
例如,如果您想获取team_id = 1的信息:
SELECT
SUM(a.goals) as goals_scored,
COUNT(*) as games_played,
SUM(a.goals)/COUNT(*) as avg_goals
FROM game_details g
LEFT JOIN
( SELECT game_id, COUNT(*) as goals FROM actions
WHERE team_id = 1 AND action_name = 'goal'
GROUP BY game_id ) a
ON g.game_id = a.game_id
WHERE g.home_team = 1 OR g.away_team = 1;