create table empSal
(
  pername varchar(200),
  salary number(10,2),
  salDate date
);

begin
insert into empsal values('ak',6300.0,'31-JAN-2012');
insert into empsal values('js',6400.0,'31-JAN-2012');
insert into empsal values('pk',6500.0,'31-JAN-2012');
insert into empsal values('ak',6000.0,'28-FEB-2012');
insert into empsal values('js',5800.0,'28-FEB-2012');
insert into empsal values('pk',2300.0,'28-FEB-2012');
end;

Дана таблица empsal (дано определение), и каждый человек получает зарплату в конце месяца в течение многих лет. нужно написать запрос plsql, чтобы найти 3 самых высокооплачиваемых за последние 10 лет данных?

0
akki2346 15 Сен 2021 в 10:29

3 ответа

Лучший ответ

Жалко, что вы на самом деле не запустили код, который вы опубликовали (так как он потерпит неудачу; таблица не может иметь этого первичного ключа, это не имеет смысла).

В любом случае: просуммируйте зарплаты за последние 10 лет и расположите их в порядке убывания. Затем выберите нужные.

WITH
   temp
   AS
      (  SELECT pername,
                SUM (salary) sumsal,
                RANK () OVER (ORDER BY SUM (salary) DESC) rnk
           FROM empsal
          WHERE EXTRACT (YEAR FROM saldate) >= EXTRACT (YEAR FROM SYSDATE) - 10
       GROUP BY pername)
SELECT pername, sumsal
  FROM temp
 WHERE rnk <= 3;
2
Littlefoot 15 Сен 2021 в 07:36

Здесь мы можем использовать аналитическую функцию RANK:

WITH cte AS (
    SELECT pername, SUM(salary) AS total_salary,
           RANK() OVER (ORDER BY SUM(salary) DESC) sal_rank
    FROM empSal
    WHERE salDate >= TRUNC(sysdate, 'YEAR') - INTERVAL '10 years'
    GROUP BY pername
)

SELECT pername, total_salary
FROM cte
WHERE sal_rank <= 3
ORDER BY sal_rank DESC;
1
Tim Biegeleisen 15 Сен 2021 в 07:35

Первичный ключ в таблице EMPSAL не позволит вам вставить одного и того же сотрудника более одного раза, как вы собираетесь это сделать. Пожалуйста, удалите его или создайте другой столбец в качестве первичного ключа.

Ниже приведено базовое заявление о выборе, которое выберет тройку лидеров за последние 10 лет с текущей даты.

with salary_tenyears as (
    select pername , sum(salary ) salary 
    from empsal 
    where salDate >= trunc(add_months(sysdate,-12*10),'MM')
    group by pername
)
select *
from ( select pername,salary  , row_number() over( order by salary desc) rnk
        from salary_tenyears
) a
where rnk <=3;
0
Toto 15 Сен 2021 в 08:15