首页 > 解决方案 > 查询可疑的理解

问题描述

假设有 10 条员工记录,每条都包含 100 的薪水值,但有一条除外,它在薪水字段中的值为空......

 SELECT SUM((AVG(LENGTH(NVL(SALARY,0)))))
 FROM DUCK
 GROUP BY SALARY;

那么当 sum 函数计算数据列表时,最后一个括号会做什么。但是 avg 函数计算出留下数字的数据?

标签: sqloracle

解决方案


在我看来,group by最后的条款是需要注意的。没有group by您将无法进行嵌套分组。尝试这样做会导致

With sal as
(
Select 100 salary from dual union all
Select 200 from dual union all
Select 300 from dual union all
Select 10 from dual union all
Select 20 from dual union all
Select 40 from dual union all
Select 50  from dual union all
Select 50  from dual union all
Select null from dual union all
Select null from dual
)
Select SUM(AVG(LENGTH(coalesce(SALARY,0))))
--,AVG(LENGTH(coalesce(SALARY,0)))
from sal

ORA-00978: nested group function without GROUP BY
00978. 00000 -  "nested group function without GROUP BY"
*Cause:    
*Action:

现在,当您添加 group by 时,sum每个按工资分组的都会重复。2.1 9因此,在这种情况下,您正在对价值时间求和。该值2.1由 AVG 派生AVG(LENGTH(coalesce(SALARY,0)))NULL在分组后被计为单个记录,而不是一个记录,因此是 9 条记录而不是 8 条记录。

希望这可以帮助。顺便说一句,它在您的应用程序中做了什么,用例?只是好奇。


推荐阅读