簡體   English   中英

如何在滿足另一個條件時創建列的 AVG

[英]How to I create an AVG of a column when another condition is met

當另一列值等於特定值時,我需要計算得分列的平均值。 但是,我的計算是計算所有分數列的平均值,而忽略了我的情況。

最終結果是根據進度列是否是每個進度值來計算所有的分數值。 例如。 “高於預期”、“預期”等。我只顯示所有測試行。

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 計算實際上是在計算所有分數的平均值。

在此處輸入圖像描述

您可以使用解析 function 如下:

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

如果我理解正確,您只需要 window function:

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;

請注意,我還介紹了表別名。 這些使查詢更易於編寫和閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM