MySQL 使用连接和查询来聚合统计信息
MySQL using joins and queries to aggregate stats
我有以下查询非常有效。
SELECT possession_team AS Team, ball_carrier_receiver AS Player,
sum(run_pass='P') AS TAR,
sum(pass_result='C') AS REC,
sum(gain) AS YDS,
ROUND(sum(gain) / sum(pass_result='C'),1) as 'AVG COMP',
max(gain) AS LG,
sum(series_end='Touchdown' AND pass_result='C') AS TD,
ROUND((sum(pass_result='C') / sum(run_pass='P')) * 100,1) AS 'COM%'
FROM plays
WHERE run_pass='P' AND pass_result <>'S' AND pass_result <>'R'
GROUP BY possession_team, ball_carrier_receiver;
但我需要让球员的名字与他的统计数据相匹配,这样输出将是 PLAYER NAME、TEAM、JERSEY,然后是他的统计数据总和。
我还有一个叫 game_rosters 的 table 。这有 first_name、last_name、team_code 和 jersey_number。 Team_code = possession_team 出自剧本 table, jersey_number = ballcarrier_receiver_number 出自剧本 table.
我尝试了很多不同的语句和连接,但我无法弄清楚。下面是我最接近的代码,但它只输出多次列出的球员姓名、球队和球衣(但也列出了没有累积任何这些统计数据的球员),没有任何统计数据的汇总。
SELECT concat(fgr.last_name,',',' ',fgr.first_name) AS Player, possession_team AS Team, ball_carrier_receiver AS Jersey FROM football.game_rosters AS fgr
LEFT JOIN football.plays AS fplays ON (fgr.jersey_number = fplays.ball_carrier_receiver);
sum(run_pass='P') AS TAR,
sum(pass_result='C') AS REC,
sum(gain) AS YDS,
ROUND(sum(gain) / sum(pass_result='C'),1) as 'AVG COMP',
max(gain) AS LG,
FROM fplays WHERE run_pass='P' AND pass_result <>'S' AND pass_result <>'R'
GROUP BY fplays.ball_carrier_receiver;
编辑:
在阅读了下面 Barmar 的 link 之后,我尝试使用从 game_rosters table 播放的总和来执行子查询。 运行 搞不定,我怕把它弄得一团糟。
SELECT ball_carrier_receiver AS Jersey, possession_team AS Team
FROM plays AS p
LEFT JOIN (
SELECT CONCAT(last_name,', ',' ',first_name) AS Player, team_code AS TEAM,
sum(played) AS GP
FROM game_rosters AS gr
GROUP BY team_code, jersey_number
) AS m
ON m.jersey_number = p.ball_carrier_receiver AND p.possession_team = m.team_code
LEFT JOIN (
SELECT ball_carrier_receiver AS Jersey, possession_team AS Team,
sum(run_pass='P') AS TAR,
sum(pass_result='C') AS REC,
sum(gain) AS YDS,
ROUND(sum(gain) / sum(pass_result='C'),1) as 'AVG COMP',
max(gain) AS LG,
sum(series_end='Touchdown' AND pass_result='C') AS TD,
ROUND((sum(pass_result='C') / sum(run_pass='P')) * 100,1) AS 'COM%'
FROM plays
WHERE run_pass='P' AND pass_result <>'S' AND pass_result <>'R' AND play_null='N'
GROUP BY possession_team, ball_carrier_receiver ORDER BY TAR DESC
) as n
ON m.jersey_number = n.ball_carrier_receiver AND n.possession_team = m.team_code;
只需在 FROM
子句后加上 JOIN
和 game_rosters
。
SELECT possession_team AS Team, CONCAT(first_name, ' ', last_name) AS Player,
sum(run_pass='P') AS TAR,
sum(pass_result='C') AS REC,
sum(gain) AS YDS,
ROUND(sum(gain) / sum(pass_result='C'),1) as 'AVG COMP',
max(gain) AS LG,
sum(series_end='Touchdown' AND pass_result='C') AS TD,
ROUND((sum(pass_result='C') / sum(run_pass='P')) * 100,1) AS 'COM%'
FROM plays AS p
JOIN game_rosters AS gr
ON gr.jersey_number = p.ball_carrier_receiver AND p.possession_team = gr.team_code
WHERE run_pass='P' AND pass_result <>'S' AND pass_result <>'R'
GROUP BY possession_team, ball_carrier_receiver;
我有以下查询非常有效。
SELECT possession_team AS Team, ball_carrier_receiver AS Player,
sum(run_pass='P') AS TAR,
sum(pass_result='C') AS REC,
sum(gain) AS YDS,
ROUND(sum(gain) / sum(pass_result='C'),1) as 'AVG COMP',
max(gain) AS LG,
sum(series_end='Touchdown' AND pass_result='C') AS TD,
ROUND((sum(pass_result='C') / sum(run_pass='P')) * 100,1) AS 'COM%'
FROM plays
WHERE run_pass='P' AND pass_result <>'S' AND pass_result <>'R'
GROUP BY possession_team, ball_carrier_receiver;
但我需要让球员的名字与他的统计数据相匹配,这样输出将是 PLAYER NAME、TEAM、JERSEY,然后是他的统计数据总和。
我还有一个叫 game_rosters 的 table 。这有 first_name、last_name、team_code 和 jersey_number。 Team_code = possession_team 出自剧本 table, jersey_number = ballcarrier_receiver_number 出自剧本 table.
我尝试了很多不同的语句和连接,但我无法弄清楚。下面是我最接近的代码,但它只输出多次列出的球员姓名、球队和球衣(但也列出了没有累积任何这些统计数据的球员),没有任何统计数据的汇总。
SELECT concat(fgr.last_name,',',' ',fgr.first_name) AS Player, possession_team AS Team, ball_carrier_receiver AS Jersey FROM football.game_rosters AS fgr
LEFT JOIN football.plays AS fplays ON (fgr.jersey_number = fplays.ball_carrier_receiver);
sum(run_pass='P') AS TAR,
sum(pass_result='C') AS REC,
sum(gain) AS YDS,
ROUND(sum(gain) / sum(pass_result='C'),1) as 'AVG COMP',
max(gain) AS LG,
FROM fplays WHERE run_pass='P' AND pass_result <>'S' AND pass_result <>'R'
GROUP BY fplays.ball_carrier_receiver;
编辑:
在阅读了下面 Barmar 的 link 之后,我尝试使用从 game_rosters table 播放的总和来执行子查询。 运行 搞不定,我怕把它弄得一团糟。
SELECT ball_carrier_receiver AS Jersey, possession_team AS Team
FROM plays AS p
LEFT JOIN (
SELECT CONCAT(last_name,', ',' ',first_name) AS Player, team_code AS TEAM,
sum(played) AS GP
FROM game_rosters AS gr
GROUP BY team_code, jersey_number
) AS m
ON m.jersey_number = p.ball_carrier_receiver AND p.possession_team = m.team_code
LEFT JOIN (
SELECT ball_carrier_receiver AS Jersey, possession_team AS Team,
sum(run_pass='P') AS TAR,
sum(pass_result='C') AS REC,
sum(gain) AS YDS,
ROUND(sum(gain) / sum(pass_result='C'),1) as 'AVG COMP',
max(gain) AS LG,
sum(series_end='Touchdown' AND pass_result='C') AS TD,
ROUND((sum(pass_result='C') / sum(run_pass='P')) * 100,1) AS 'COM%'
FROM plays
WHERE run_pass='P' AND pass_result <>'S' AND pass_result <>'R' AND play_null='N'
GROUP BY possession_team, ball_carrier_receiver ORDER BY TAR DESC
) as n
ON m.jersey_number = n.ball_carrier_receiver AND n.possession_team = m.team_code;
只需在 FROM
子句后加上 JOIN
和 game_rosters
。
SELECT possession_team AS Team, CONCAT(first_name, ' ', last_name) AS Player,
sum(run_pass='P') AS TAR,
sum(pass_result='C') AS REC,
sum(gain) AS YDS,
ROUND(sum(gain) / sum(pass_result='C'),1) as 'AVG COMP',
max(gain) AS LG,
sum(series_end='Touchdown' AND pass_result='C') AS TD,
ROUND((sum(pass_result='C') / sum(run_pass='P')) * 100,1) AS 'COM%'
FROM plays AS p
JOIN game_rosters AS gr
ON gr.jersey_number = p.ball_carrier_receiver AND p.possession_team = gr.team_code
WHERE run_pass='P' AND pass_result <>'S' AND pass_result <>'R'
GROUP BY possession_team, ball_carrier_receiver;