mysql - 嵌套分组mysql
问题描述
我有一个results
包含以下重要列的表:
f_team1
(VARCHAR)f_team2
(VARCHAR)f_player1
(VARCHAR)f_player2
(VARCHAR)f_total_ftg
(INT)
Ateam
可以在任何一个f_team1
或f_team2
列中
Aplayer
可以在任何一个f_player1
或f_player2
列中
我正在尝试为每个玩家找到 f_total_ftg 的 AVG,然后获取该 AVG 并将其应用于每个团队。因此,这team_average
将是所有个人玩家平均值的总和。
我的尝试:
SELECT team,
(
SELECT AVG(player_team_average) AS players_team_average
FROM
(
SELECT AVG(CASE WHEN f_team1='arsenal' OR f_team2='arsenal' THEN f_total_ftg END) AS team_average
FROM
(
SELECT f_player1 AS player, f_team1, f_team2, f_total_ftg FROM results
UNION
SELECT f_player2 AS player, f_team1, f_team2, f_total_ftg FROM results
) x GROUP BY player
) x
) AS team_average FROM (
(SELECT f_team1 AS team, f_total_ftg FROM results)
UNION
(SELECT f_team2 AS team, f_total_ftg FROM results)
) x GROUP BY team
电流输出:
正如您从我的代码中看到的那样,我已经将团队设置为arsenal
,这为不同球员的阿森纳提供了正确的总体平均水平。我怎样才能为每个团队做到这一点?我需要分出字符串并为每个团队应用平均值。
我怎样才能做到这一点?
表如下所示:
解决方案
这是你想要的吗?
select team, sum(avg_ftg) sum_avg_ftg
from (
select team, player, avg(f_total_ftg) avg_ftg
from (
select f_team1 team, f_player1 player, f_total_ftg from mytable
union all select f_team2, f_player2, f_total_ftg from mytable
) t
group by team, player
) t
group by team
这将团队/玩家元组转为行,然后计算每个玩家和团队的平均 ftg,最后将每个团队的平均值相加。
在 MySQL 的最新版本中,这可以通过横向连接更有效地表达:
select team, sum(avg_ftg) sum_avg_ftg
from (
select x.team, x.player, avg(t.f_total_ftg) avg_ftg
from mytable t
cross join lateral (
select t.f_team1 team, t.f_player1 player
union all select t.f_team2, t.f_player2
) x
group by x.team, x.player
) t
group by team
推荐阅读
- java - 安卓工作室滑翔
- python - 有没有办法将 x,y 坐标转换为灰度矩阵?(Python)
- android - 如何循环遍历数组中的项目,并且仍然能够与 android studio 中的其他按钮和 UI 元素进行交互
- java - 使用 StAX 和 OkHttp3 解析大型 SOAP 响应时数据泄漏
- javascript - 确保 GraphQL ID 是 Mongo ObjectId
- c# - 无法对图像进行分类 - 检查内部异常以获取更多详细信息
- mysql - 如何查找在 Moodle 中尝试作业的学生总数和学生总数?
- perforce - 是否可以在 perforce 中搁置已删除的文件?
- java - 从 src/main/resources 读取会在命令行上给出 java.nio.file.InvalidPathException (但在 Eclipse 中工作正常)
- javascript - Vue 新手,卡在全局变量上