今天在操作數據庫時遇到了oracle的報錯,錯誤類型爲ORA-00978/ORA-00937,經與同事討論研究之後發現一個特別容易犯錯的點。
首先,我的目的是從一個表中取出一列數值,然後對這一列數值進行求和並平均
取數SQL爲:select b.vendor from t_cm_networknode b where b.vendor is not null
求和並平均SQL爲:select avg(sum(f.vendor)) from (select b.vendor from t_cm_networknode b where b.vendor is not null) f (不要質疑爲什麼不在取數時直接進行sum avg–!)
取數SQL結果如下:
求和平均SQL卻報錯,錯誤類型如下:
然後查詢ORA-00978原因後,修改SQL爲:
select f.cloud ,avg(sum(f.vendor)) from (select 12321 as cloud, b.vendor from t_cm_networknode b where b.vendor is not null) f group by cloud
運行扔報錯,錯誤提示爲ORA-00937:
然後繼續修改SQL如下:
select avg(sum(f.vendor)) from (select b.vendor from t_cm_networknode b where b.vendor is not null) f group by vendor
結果如下:
值出來了,但似乎是求和,並沒有平均
然後繼續修改SQL爲:
select sum(f.vendor)/count(f.vendor) from (select b.vendor from t_cm_networknode b where b.vendor is not null) f
結果爲:
好了,這就是我們想要的結果,想必看到這裏,對於錯誤的原因應該也清楚了。
錯誤總結:
oralce中聚合函數(count、max、min、sum、avg等)在使用時,必須指定其聚合的維度對象,也就是必須通過group by來實現其聚合對象的分類,若聚合結果只有一條數值,則不需要group by指定聚合對象。
本次報錯的原因在於avg(sum())時,sum()後就是一條數據,avg()的對象只有一條,故報錯ORA–00978,後續增加雖增加了group by cloud ,但avg()也是一條,無法對應多個cloud,故報錯ORA–00937,
在針對結果只有一條數據的匯聚時,用sum()/count()即可。
————————————————
版權聲明:本文爲CSDN博主「walking_visitor」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/walking_visitor/article/details/80908480