I think this is exactly what you want..
Declare @Colms varchar(max)=''
SELECT
@Colms= Stuff((SELECT ', [' + cast(s as varchar(max))+']'
FROM
(select distinct AA as s from YYYY where id in (select id from xxxx)) x
For XML PATH ('')),1,1,'')
exec('select id,A,B,C,D,'+@Colms+'
from
(
select p.*,q.AA,q.BB from xxxx p left join YYYY q on p.id=q.id
) x
pivot
(
max(BB)
for AA in('+@Colms+')
)p ')