SQL-запрос для получения сотрудника, чья зарплата увеличилась после ноября - PullRequest
0 голосов
/ 19 февраля 2019

Предположим, у нас есть таблица с именем PMT,

Таблица содержит три столбца i.e (ID, Pmt_Date and Pmt_Amount),

Здесь столбец ID является Primary Key.

Сейчасу нас есть сумма платежа вместе с датами оплаты за четыре месяца для каждого сотрудника i.e Nov 2018,Dec 2018, Jan 2018 and Feb 2018.

В запросе должны быть указаны идентификаторы всех сотрудников, чья заработная плата ИЗМЕНИЛА (увеличилась или уменьшилась) после ноября 2018 года.

Ответы [ 4 ]

0 голосов
/ 19 февраля 2019
SELECT * FROM `salary` WHERE `Pmt_Date` > '2019-05-30' AND `Pmt_Amount` <> (SELECT AVG(Pmt_Amount) AS avg FROM `salary` WHERE `Pmt_Date` <= '2019-05-30')

enter image description here

Я использовал апрель месяц вместо ноября

0 голосов
/ 19 февраля 2019

Вы можете использовать exists:

select p.id from payments p
where exists (
  select 1 from payments 
  where 
  id = p.id and 
  month(pmt_date) = 11 and year(pmt_date) = 2018 and 
  pmt_amount <> p.pmt_amount
)
where p.pmt_date >= '2018-12-01'

Это позволит получить идентификаторы сотрудников, чья зарплата изменилась после ноября,значение от '2018-12-01', по сравнению с зарплатой ноября.

0 голосов
/ 19 февраля 2019
select ID
from PMT
where Pmt_Date => '2018-11-01'
group by ID
having count(distinct Pmt_Amount) > 1

Если Pmt_Amount изменилось с 2018-11-01, количество отдельных платежей (count(distinct Pmt_Amount)) будет больше 1.

0 голосов
/ 19 февраля 2019

Вы можете попробовать что-то вроде этого

create table #PMT(
ID Int Identity(1, 1) not null primary Key, 
empCd varchar(5), 
Pmt_Date varchar(10), 
Pmt_Amount decimal(18, 2))

Insert into #PMT (empCd, Pmt_Date, Pmt_Amount) values
('A001', 'Nov 2018', 10000),('A001', 'Dec 2018', 10000),('A001', 'Jan 2018', 10000),('A001', 'Feb 2018', 10000),
('A002', 'Nov 2018', 15000),('A002', 'Dec 2018', 15000),('A002', 'Jan 2018', 15000),('A002', 'Feb 2018', 15000),
('A003', 'Nov 2018', 25000),('A003', 'Dec 2018', 15000),('A003', 'Jan 2018', 22000),('A003', 'Feb 2018', 23000),
('A004', 'Nov 2018', 55000),('A004', 'Dec 2018', 45000),('A004', 'Jan 2018', 46000),('A004', 'Feb 2018', 47000),
('A005', 'Nov 2018', 48000),('A005', 'Dec 2018', 45000),('A005', 'Jan 2018', 46000),('A005', 'Feb 2018', 47000)

Select distinct emp.empCd, emp.Name
from #PMT p
inner join #emp emp on p.empCd = emp.empCd
where p.Pmt_Amount not in (

Select Pmt_Amount from #PMT 
inner join #emp on #PMT.empCd = #emp.empCd
where Pmt_Date <> 'Nov 2018'

) and p.Pmt_Date = 'Nov 2018'

Здесь результат будет таким, как показано ниже.

empCd   Name
-----------
A003    C
A004    D
A005    E

Здесь на выходе A и B не пришли, потому что его зарплаты одинаковыкак в ноябре 2018. Вы можете изменить тип данных как дату вместо Varchar и применить Month() и Year() с датой, чтобы также получить месяц и год платежа.

Чтобы получить сотрудника, который получил ихЗарплата такая же, как и в другой месяц, вам нужно использовать только оператор in вместо оператора not in, как показано ниже.

Select distinct emp.empCd, emp.Name
from #PMT p
inner join #emp emp on p.empCd = emp.empCd
where p.Pmt_Amount in (

Select Pmt_Amount from #PMT 
inner join #emp on #PMT.empCd = #emp.empCd
where Pmt_Date <> 'Nov 2018'

) and p.Pmt_Date = 'Nov 2018'

Вы можете найти живую демонстрацию Здесь .

...