mysql - 如何在满足另一个条件时创建列的 AVG
问题描述
当另一列值等于特定值时,我需要计算得分列的平均值。但是,我的计算是计算所有分数列的平均值,而忽略了我的情况。
最终结果是根据进度列是否是每个进度值来计算所有的分数值。例如。“高于预期”、“预期”等。我只显示所有测试行。
SELECT
tbl_score.score,
tbl_progress.progress
(SELECT AVG(tbl_score.score) FROM tbl_score WHERE tbl_progress.progress = 'Expected') as expectedAv
FROM tbl_score
JOIN tbl_pupil ON tbl_score.pupilID = tbl_pupil.pupilID
JOIN tbl_test ON tbl_score.testID = tbl_test.testID
LEFT JOIN tbl_progress ON tbl_pupil.pupilID = tbl_progress.pupilID AND tbl_test.testID = tbl_progress.testID
WHERE
tbl_test.schoolproviderID=16 AND tbl_test.schoolproductID=32 AND tbl_test.imported=1
ORDER by tbl_progress.progress
但是,结果看起来像这样,显示 av 计算实际上是在计算所有分数的平均值。
解决方案
您可以使用如下分析函数:
select score, progress,
sum(case when progress = 'Expected' then score end) over (partition by progress)
/ count(case when progress = 'Expected' then 1 end) over (partition by progress)
as avg_
from your_Table
如果您想在自己的查询中实现解决方案,那么您可以替换
(SELECT AVG(tbl_score.score) FROM tbl_score WHERE tbl_progress.progress = 'Expected')
as expectedAv
和
sum(case when tbl_progress.progress = 'Expected' then tbl_score.score end)
over (partition by tbl_progress.progress)
/ count(case when tbl_progress.progress = 'Expected' then 1 end)
over (partition by tbl_progress.progress) as expectedAv
推荐阅读
- iccube - 从重复小部件内的小部件触发事件
- json - 如何将json数据插入数据库
- php - 为什么在使用类名和命名空间时不能实例化这个类?
- r - 检查列的任何组合是否等于矩阵中的某个特定值
- excel - 基于一列对相应的行进行分组
- create-react-app - Create-react-app:服务器是什么(npm start 脚本)?
- vb.net - 使用 `Task.Run` 调用同步方法时出现意外结果
- python-3.x - 检测到 IMKClient Stall,*请报告*您的用户场景附加了捕获问题的 spindump(或 sysdiagnose)
- java - 是不必要的分号语法错误吗?
- android - 来自 R.drawable 的 +imageResource 在 Jetpack Compose 中导致 IllegalArgumentException