According to your requirement, you need to divide the SOQL into 2 parts.
1) Retrieve the sort list of Employee_Skills__c records and put those into wrapper class.
2) Retrieve the Contact records with Employee_Training__r and Employee_Certifications__r.
3) Finally compare the contact Ids and assign the values.
public class WrapperClass
{
public Id contactId{get;set;}
public String ContactName {get;set;}
public String SkillName{get;set;}
public String Proficiency {get;set;}
public Integer YearOfExp {get;set;}
public String SkillType {get;set;}
public String TrainingName {get;set;}
public String CertificationName {get;set;}
}
List<Employee_Skills__c> lstEmpSkills = [SELECT Skill_ID__r.Name, Proficiency__c, Year_of_Experience__c, Skill_Type__c, Contact.Id, Contact.Name, Contact.Email
FROM Employee_Skills__c
ORDER BY Proficiency__c DESC, Skill_Type__c ASC];
Map<Id, WrapperClass> wrapperMap = new Map<Id, WrapperClass>();
for(Employee_Skills__c empObj:lstEmpSkills)
{
List<WrapperClass> lstWrapper = new List<WrapperClass>();
if(wrapperMap.containsKey(empObj.Contact.Id))
{
lstWrapper = wrapperMap.get(empObj.Contact.Id);
}
WrapperClass wrapper = new WrapperClass();
wrapper.contactId = empObj.Contact.Id;
lstWrapper.add(wrapper);
wrapperMap.put(wrapper.contactId, lstWrapper);
}
List<Contact> lstContact = [SELECT Id,
, (SELECT Training_ID__r.Name FROM Employee_Training__r)
, (SELECT Certification_ID_r.Name FROM Employee_Certifications__r)
FROM Contact];
for(Contact con:lstContact)
{
//now retrive the contact from the wrapperMap
//verify the same contact Id and assign the TrainingName and CertificationName into the record.
}
Note: I haven't compiled the code, just given you an approach