mysql - 如何计算同一记录的不同平均值?
问题描述
我有一个venue
不同的地方teams
可以播放的列表match
。现在,一个team
for eachmatch
可以得到一个attendance
for the venue
,所以我试图计算 的AVG
,attendance
问题是我得到的结果分组为 one venue
,那是因为我使用了一个聚合函数并且我被迫使用GROUP BY
,查询应该返回相同venue
但不同teams
且AVG attendance
当然不同。
询问
SELECT m.venue_id,
MIN(m.venue_attendance) AS min_attendance,
MAX(m.venue_attendance) AS max_attendance,
SUM(m.venue_attendance) AS venue_sum,
v.name AS venue_name,
ROUND(AVG(m.venue_attendance), 2) AS average,
v.capacity, t.name AS team_name
FROM `match` m
INNER JOIN venue v ON v.id = m.venue_id
INNER JOIN team_info i ON i.venue_id = m.venue_id
INNER JOIN team t ON t.id = i.team_id
WHERE m.round_id = :round_id
GROUP BY m.venue_id, t.name
ORDER BY average DESC
数据样本
匹配
id | round_id | home_team_id | away_team_id | venue_id | venue_attendance
2506177 28 70 71 10 6000
2506195 28 70 76 10 500
2506204 28 70 69 10 2000
2506219 28 70 72 10 500
2506230 28 70 2517 10 300
2506235 28 70 2522 10 500
2506244 28 70 10049 10 400
2506252 28 70 12573 10 6000
2506258 28 2518 70 10 4500
2506267 28 70 71 10 1000
2506285 28 70 76 10 700
2506294 28 70 69 10 1500
2506303 28 70 2518 10 2500
2506309 28 70 72 10 1200
2506320 28 70 2517 10 1200
2506325 28 70 2522 10 800
2506334 28 70 10049 10 5500
2506342 28 70 12573 10 1000
场地
id | name | address | zip_code | city | phone |
10 Stadiumi Loro Boriçi Rruga Musa Luli 1 4000 Shkodër NULL
团队信息
team_id | venue_id |
70 10
2518 10
团队
id | name
70 Skënderbeu Korçë
2518 Vllaznia Shkodër
输出
{
"venue_id": "10",
"min_attendance": "300",
"max_attendance": "6000",
"venue_sum": "36100",
"venue_name": "Stadiumi Loro Boriçi",
"average": "2005.56",
"capacity": "16000",
"team_name": "Vllaznia Shkodër"
}
预期产出
{
"venue_id": "10",
"min_attendance": "300",
"max_attendance": "6000",
"venue_sum": "31600",
"venue_name": "Stadiumi Loro Boriçi",
"average": "1858",
"capacity": "16000",
"team_name": "Vllaznia Shkodër"
},
{
"venue_id": "10",
"min_attendance": "4500",
"max_attendance": "4500",
"venue_sum": "4500",
"venue_name": "Stadiumi Loro Boriçi",
"average": "4500",
"capacity": "16000",
"team_name": "Skënderbeu Korçe"
}
正如你所看到的,venue_sum
应该只team
在主场比赛时计算,看场home_team_id
,平均值是 的总和venue_sum / matches played by the team
,例如,Vllaznia Shkodër
我们有平均:31600 / 17 = 1858。
完整数据库:https ://files.fm/u/2xwgkaxz
要访问示例中的数据,只需运行:
SELECT * FROM `match` WHERE round_id = 28
我该如何处理?
scaisEdge 答案:
scaisEdge 提出的解决方案仅适用于精化结果,实际上现在的平均值是正确的。主要问题仍然存在,事实上 scaisEdge 查询的实际结果是这样的:
{
"venue_id": "10",
"min_attendance": "300",
"max_attendance": "6000",
"venue_sum": "31600",
"venue_name": "Stadiumi Loro Boriçi",
"average": "1858.82",
"capacity": "16000",
"team_name": "Vllaznia Shkodër"
}
还有其他场地,但我想把注意力集中在这个上,正如我之前所说的,我需要为不同的团队返回同一个场地,所以我也应该得到:
{
"venue_id": "10",
"min_attendance": "4500",
"max_attendance": "4500",
"venue_sum": "4500",
"venue_name": "Stadiumi Loro Boriçi",
"average": "4500",
"capacity": "16000",
"team_name": "Skënderbeu Korçe"
}
但我只得到:
{
"venue_id": "10",
"min_attendance": "300",
"max_attendance": "6000",
"venue_sum": "31600",
"venue_name": "Stadiumi Loro Boriçi",
"average": "1858.82",
"capacity": "16000",
"team_name": "Vllaznia Shkodër"
}
所以预期的最终结果必须包括:
{
"venue_id": "10",
"min_attendance": "300",
"max_attendance": "6000",
"venue_sum": "31600",
"venue_name": "Stadiumi Loro Boriçi",
"average": "1858.82",
"capacity": "16000",
"team_name": "Vllaznia Shkodër"
},
{
"venue_id": "10",
"min_attendance": "4500",
"max_attendance": "4500",
"venue_sum": "4500",
"venue_name": "Stadiumi Loro Boriçi",
"average": "4500",
"capacity": "16000",
"team_name": "Skënderbeu Korçe"
}
解决方案
你应该加入 home_team_id
SELECT m.venue_id,
MIN(m.venue_attendance) AS min_attendance,
MAX(m.venue_attendance) AS max_attendance,
SUM(m.venue_attendance) AS venue_sum,
v.name AS venue_name,
ROUND(AVG(m.venue_attendance), 2) AS average,
v.capacity, t.name AS team_name
FROM `match` m
INNER JOIN venue v ON v.id = m.venue_id
INNER JOIN team_info i ON i.venue_id = m.venue_id and i.team_id = m.home_team_id
INNER JOIN team t ON t.id = m.home_team_id
WHERE m.round_id = :round_id
GROUP BY m.venue_id, t.name
ORDER BY average DESC
推荐阅读
- laravel - 属性标签在前端不起作用
- ruby-on-rails - ruby on rails 在页面内渲染两个表单
- python - 为什么我一直将“1”类作为预测类?
- jquery - 在 jquery.validate submitHandler 中使用 bootbox.confirm
- haskell - 在 Haskell 中合并自定义数据类型的记录
- python - 当您没有训练代码或原始预测/测试代码时,是否可以为保存的模型重新创建 tensorflow 预测脚本?
- asp.net-mvc - 如何在添加操作中加载最后一个employeeid + 1的值
- monaco-editor - 无法在 Cloud Shell 中的 Monaco 编辑器中编辑 .json 文件(错误?)
- c++ - 我的代码究竟在哪里不符合键和值类型的规范?
- java - 除非表中存在一行,否则每 30 秒调用一次方法