Вы не фильтруете подзапрос (SELECT TOP 1 RemainingAdvance FROM SalaryDetails ORDER BY CreatedDate DESC
) по любому идентификатору сотрудника, поэтому он дает вам первую запись во всей таблице при сортировке по CreatedDate DESC
(что, я предполагаю, равно 354).
Возможно, вы захотите переместить это табличное выражение в ваше предложение FROM, а не в SELECT, включить свой идентификатор сотрудника и выполнить соединение с этим выражением.
SELECT
e.Emp_Id,e.Identity_No,e.Emp_Name,case WHEN e.SalaryBasis=1 THEN 'Weekly' ELSE 'Monthly' end as SalaryBasis,e.FixedSalary,
from Employee as e inner join Designation as d on e.Desig_Id=d.Desig_Id
inner join SalaryDetails as S on e.Emp_Id=S.EmpId
inner join
(SELECT EmpID, RemainingAdvance, RANK() OVER (PARTITION BY EmpID ORDER BY CreatedDate DESC) AS SalaryRank FROM SalaryDetails ORDER BY CreatedDate DESC) as Advance ON Advance.EmpID = e.Emp_ID AND Advance.SalaryRank = 1
Это только от макушки моей головы, поэтому для корректной работы может потребоваться небольшая настройка. Обратите внимание также на использование функции RANK () - если вы используете TOP 1, вы получите только первую запись всей таблицы. Вам нужна первая запись на сотрудника ID .
Если бы это был я, я, вероятно, сделал бы это табличное выражение представлением или даже скалярной функцией, принимающей идентификатор сотрудника и возвращающей первое значение RemainingAdvance, тогда вы могли бы использовать TOP 1 и отфильтровать идентификатор сотрудника.