Add a constant to your query which will be unique for the query:
SELECT 1 as queryId, sp.PK as swithPersonId, ...
UNION ALL
SELECT 2 as queryId, sp.PK as swithPersonId, ...
ORDER BY queryId, swithPersonId, PK, Half
This way the results of the first query will always come before the results of the second query.
Edit - complete query
with cte as (
select sp.PK as swithPersonId, sp.PTPK, emp.Employee_Name, emp.PK, pro.Name, sp.SwitchDate, sp.Half, sp.LeadBy, sp.EmployeeNamePK
from switch_person sp
INNER JOIN projects pro ON sp.PTPK = pro.PK
INNER JOIN employee emp ON sp.EmployeeNamePK = emp.PK
where pro.TeamLead = 33
AND sp.SwitchDate = '2015-6-25'
AND sp.Half IN (1,2)
)
, cte2 as
(
select 1 as queryId, swithPersonId, PTPK, Employee_Name, PK, Name, SwitchDate, Half
from cte where LeadBy <> EmployeeNamePK
union all
select 2 as queryId, swithPersonId, PTPK, Employee_Name, PK, Name, SwitchDate, Half
from cte where LeadBy = EmployeeNamePK
)
select swithPersonId, PTPK, Employee_Name, PK, Name, SwitchDate, Half
from cte2
order by queryId, swithPersonId, PK, Half
First CTE gets the data you need. Second CTE separates the two queries based on LeadBy value where all records with "LeadBy <> EmployeeNamePK" will get before any records where "LeadBy = EmployeeNamePK". Finally we only select those columns which we are interested in and order the results.