Я думаю, что это могло бы сделать это (я также сделал это немного более читабельным):
WITH LatestJob AS (
SELECT * FROM
(SELECT
aId
,Position
,StartDate
,Enddate
,SpecializationId
,ROW_NUMBER() OVER (PARTITION BY aId ORDER BY
(CASE WHEN Enddate IS NULL THEN 0 ELSE 1 END) ASC
,CAST(Enddate AS datetime) DESC
) AS RN
FROM
EmploymentDetails ed
) E
WHERE RN = 1
)
,EarliestStart AS (
SELECT
aID
,SUM(DATEDIFF(YEAR, Startdate, ISNULL(Enddate,GETDATE()))) AS YearsExperience
FROM
EmploymentDetails
GROUP BY
aId
)
(
SELECT
u.Id
,u.FirstName + ' ' + u.LastName AS NAME
,lj.Position AS LatestPosition
,aps.cId
,aps.ApStatusID AS ApplicationStatus
,aps.sId AS SpecializationId
,YearsExperience
,ad.ExpectedSalary
,REPLACE(ISNULL(Address1, '') + ', ' + ISNULL(Address2, '') + ', ' + ISNULL(City, ''), ', ,', ',') AS Address
FROM
Users u
JOIN
LatestJob lj ON u.Id = lj.aid
JOIN
EarliestStart ye ON ye.aId = u.Id
JOIN
ApplicantDetails ad ON ad.aId = u.Id
JOIN
ApplicationStatus aps ON aps.aId=u.Id
)
UNION ALL
(
SELECT
u.Id
,u.FirstName + ' ' + u.LastName AS NAME
,lj.Position AS LatestPosition
,YearsExperience
,ad.ExpectedSalary
,REPLACE(ISNULL(Address1, '') + ', ' + ISNULL(Address2, '') + ', ' + ISNULL(City, ''), ', ,', ',') AS Address
FROM
Users u
JOIN
LatestJob lj ON u.Id = lj.aid
JOIN
EarliestStart ye ON ye.aId = u.Id
JOIN
ApplicantDetails ad ON ad.aId = u.Id
WHERE
u.RoleId = 3
AND u.UserStatusId = 1
AND lj.SpecializationId = 38 --@sId
)
Надеюсь, я не потерял информацию и не скопировал ее по пути.Он только правильно анализирует, поэтому я не уверен, что он действительно вернет то, что вы хотите.