Oracle Query для получения CURRENT CTC (зарплата) каждого сотрудника - PullRequest
1 голос
/ 20 мая 2010

я хочу текущий CTC каждого сотрудника, следующий дизайн моей таблицы

Ecode      Implemented Date            Salary
7654323    2010-05-20                  350000
7654322    2010-05-17                  250000
7654321    2003-04-01                  350000
7654321    2004-04-01                  450000
7654321    2005-04-01                  750000
7654321    2007-04-01                  650000

я хочу запрос оракула для следующего вывода

Ecode          Salary
7654321        650000   
7654322        250000 
7654323        350000

заранее спасибо

См. Также

Запрос Oracle для получения MAximum CTC (зарплата) каждого сотрудника

Ответы [ 3 ]

3 голосов
/ 20 мая 2010

Если вы хотите сохранить последнюю зарплату для каждого ecode, отсортированного по implemented_date:

SQL> WITH data AS (
  2     SELECT 7654323 Ecode, '2010-05-20' Implemented_Date, 350000 Salary
  3       FROM DUAL
  4     UNION ALL SELECT 7654322, '2010-05-17', 250000 FROM DUAL
  5     UNION ALL SELECT 7654321, '2003-04-01', 350000 FROM DUAL
  6     UNION ALL SELECT 7654321, '2004-04-01', 450000 FROM DUAL
  7     UNION ALL SELECT 7654321, '2005-04-01', 750000 FROM DUAL
  8     UNION ALL SELECT 7654321, '2007-04-01', 650000 FROM DUAL
  9  )
 10  SELECT ecode,
 11         MAX(salary)
 12             KEEP (dense_rank FIRST ORDER BY Implemented_Date DESC) sal
 13    FROM DATA
 14   GROUP BY ecode;

     ECODE        SAL
---------- ----------
   7654321     650000
   7654322     250000
   7654323     350000
1 голос
/ 20 мая 2010

Я бы использовал аналитические функции для этого. Вы хотите выбрать первое значение заработной платы для каждой комбинации ecode и внедренной даты, упорядоченной внедренной датой, чтобы поместить последнюю в верхнюю.

select
    distinct
    first_value(ecode) OVER (PARTITION BY ecode ORDER BY IMPLEMENTEDDATE DESC NULLS LAST) Ecode, 
    first_value(implementeddate) OVER (PARTITION BY ecode ORDER BY IMPLEMENTEDDATE DESC NULLS LAST) ImplementedDate,
    first_value(salary) OVER (PARTITION BY ecode ORDER BY IMPLEMENTEDDATE DESC NULLS LAST) Salary
from 
    tbl_Salary;

"DISTINCT" будет держать нулевые строки в безвыходном положении, которые в противном случае были бы возвращены для других 3 версий Ecode = 7654321, которые мы отфильтровываем.

Результат:

ECODE  IMPLEMENTEDDATE  SALARY
-----  ---------------  ------
7654321     01/04/2007      650000
7654322     17/05/2010      250000
7654323     20/05/2010      350000
1 голос
/ 20 мая 2010
SELECT * 
FROM salary s
INNER JOIN 
  (SELECT ecode, MAX(implemented_date) as implemented_date 
   FROM salary GROUP BY ecode) curr
ON curr.ecode = s.ecode AND curr.implemented_date = s.implemented_date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...