【问题标题】:How to I create an AVG of a column when another condition is met如何在满足另一个条件时创建列的 AVG
【发布时间】:2023-04-04 15:11:01
【问题描述】:

当另一列值等于特定值时,我需要计算得分列的平均值。但是,我的计算是计算所有分数列的平均值,而忽略了我的条件。

最终结果是根据进度列是否是每个进度值来计算所有的得分值。例如。 “高于预期”、“预期”等。我只显示所有行进行测试。

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 计算实际上是在计算所有分数的平均值。

【问题讨论】:

标签: mysql sql database average


【解决方案1】:

你可以使用如下解析函数:

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

【讨论】:

    【解决方案2】:

    如果我理解正确,你只需要一个窗口函数:

    SELECT s.score, pr.progress,
           AVG(s.score) OVER (PARTITION BY pr.progress) as expectedAvg
    FROM tbl_score s JOIn
         tbl_pupil p
         ON s.pupilID = p.pupilID JOIN
         tbl_test t
         ON s.testID = t.testID LEFT JOIN
         tbl_progress pr
         ON p.pupilID = pr.pupilID AND
            t.testID = pr.testID 
    WHERE t.schoolproviderID = 16 AND
          t.schoolproductID = 32 AND
          t.imported = 1
    ORDER by pr.progress;
    

    请注意,我还介绍了表别名。这些使查询更易于编写和阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多