桐&露 2022-06-24 09:07 采纳率: 40%
浏览 21

聚合函数参数的数据类型要求

关于ORACLE数据库
聚合函数参数的数据类型要求

问题是关于一道子查询的试题,如下:

原题:查找平均工资最高的部门
相关字段 :SAL薪资 DEPTNO:部门编号 EMP表名

正解:(将子查询作为数据源)
SELECT DEPTNO FROM EMP
GROUP BY DEPTNO
HAVING AVG(SAL) = (SELECT MAX(A) FROM (SELECT DEPTNO,AVG(SAL) A FROM EMP GROUP BY DEPTNO))

出现的问题:
个人做了个新的尝试:关于求【各部门平均薪资的最高值】的部分
SELECT MAX((SELECT AVG(SAL) FROM EMP GROUP BY DEPTNO)) --子查询是一行三列的数据
FROM EMP;
---ERROR:单行子查询返回多个行

报错原因不太理解
因为SELECT AVG(SAL) FROM EMP GROUP BY DEPTNO的返回值是一个【一行三列】的查询结果集,单跑是可以跑出来的
但是再嵌套入MAX()作为参数,就会报错。
个人尝试过聚合函数可以嵌套:【MAX(AVG(SAL)) +GROUP BY DEPTNO】是可以实现的
但是希望尝试用子查询的值作为参数,就会报错。
所以想清楚AVG()的返回值和SELECT的返回值有什么区别

  • 写回答

2条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-06-25 12:21
    关注

    首先,你是不是把行和列的概念搞混了,行是横着的,列是竖着的,像 SELECT AVG(SAL) FROM EMP GROUP BY DEPTNO 这种sql,明显就只有一个列,而你描述它是三个列,因此这里的效果应该是一列三行,即对应单行子查询返回多行的报错。
    报错的sql要进行如下改写才行

    SELECT MAX((SELECT AVG(SAL) FROM EMP b where a.DEPTNO=b.DEPTNO ))
    FROM EMP a;
    

    虽然表名都一样,但select了两次,数据库就把它当两个表使用,需要进行关联

    评论
    1人已打赏

报告相同问题?

问题事件

  • 创建了问题 6月24日

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题