Hard to provide specifics when you don't layout your tables and their relationships.
You could define a calculation field that returns different fields depending on the value selected in phone type:
Case ( CommunicationTypeField = "phone" ; PhoneField ;
CommunicationTypeField = "email" ; EmailField ;
CommunicationTypeField = "fax" ; Faxfield )
But that assumes that each contact info is stored in a separate field of the same record or the same related record (modify field references to be tableoccurrence::PhoneField instead of just PhoneField) and I don't know if that's how you've set up your tables or not.