查询可疑理解

问题描述 投票:1回答:1

假设有十个员工记录,每个包含薪水值100,除了一个,它在薪水字段中为空值。...

 SELECT SUM((AVG(LENGTH(NVL(SALARY,0)))))
 FROM DUCK
 GROUP BY SALARY;
  • 第一个内部括号NVL(SALARY, 0)->前9位员工的薪水为100,最后一位为0。

  • 第二个内部括号LENGTH()->前9个为3,后一个为0。

  • 第三内括号AVG()计算10名雇员的薪资时长,即((3 * 9)+0)/ 10 = 2.7

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

sql oracle
1个回答
0
投票

我认为结尾处的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:

现在,当您添加分组依据时,对于按薪金分组的每个分组都将重复sum。因此,在这种情况下,您将2.1 9值相加。 NULL被计为个人记录,而不是被分组后的一个记录,因此是9个记录而不是8个记录。

希望这会有所帮助。顺便说一下,它在您的应用程序中是什么用例?只是好奇。

© www.soinside.com 2019 - 2024. All rights reserved.