编写PL/SQL查询获取近10年empsal表中收入最高的3名人员
解决方案
以下是适配Oracle数据库的查询实现,两种方案分别适配不同的排名需求:
方案1:基础实现(严格返回3条,不处理并列排名)
直接按收入总额倒序取前3,适合不需要考虑同分并列的场景:
SELECT pername, total_salary FROM ( SELECT pername, SUM(salary) AS total_salary FROM empSal -- 筛选近10年的薪资记录,TRUNC去掉当前时间的时分秒避免边界误差 WHERE salDate >= ADD_MONTHS(TRUNC(SYSDATE), -12 * 10) GROUP BY pername ORDER BY total_salary DESC ) WHERE ROWNUM <= 3;
方案2:兼容并列排名(同分同排名,返回所有符合前3顺位的人员)
如果存在多人收入总额相同的情况,用RANK()窗口函数处理更合理,不会漏掉并列人员:
SELECT pername, total_salary FROM ( SELECT pername, SUM(salary) AS total_salary, RANK() OVER(ORDER BY SUM(salary) DESC) AS sal_rank FROM empSal WHERE salDate >= ADD_MONTHS(TRUNC(SYSDATE), -12 * 10) GROUP BY pername ) WHERE sal_rank <= 3;
PL/SQL 匿名块直接输出结果示例
如果需要在PL/SQL环境下直接打印结果,可以用以下写法(Oracle 12c+支持):
DECLARE BEGIN FOR rec IN ( SELECT pername, SUM(salary) AS total_salary FROM empSal WHERE salDate >= ADD_MONTHS(TRUNC(SYSDATE), -12 * 10) GROUP BY pername ORDER BY total_salary DESC FETCH FIRST 3 ROWS ONLY ) LOOP DBMS_OUTPUT.PUT_LINE('员工姓名:' || rec.pername || ',近10年总收入:' || rec.total_salary); END LOOP; END; /
内容的提问来源于stack exchange,提问作者akki2346
相关产品推荐
相关产品推荐

