Вы можете использовать условное агрегирование:
select x,
max(case when y = 'A' then distance else 0 end) as A,
max(case when y = 'B' then distance else 0 end) as B,
max(case when y = 'C' then distance else 0 end) as C,
max(case when y = 'D' then distance else 0 end) as D
from t cross apply
(values (col1, col2), (col2, col1)) v(x, y)
group by x;
Я предупрежу вас о попытке масштабировать это. SQL Сервер имеет ограничение на количество столбцов, которые могут быть возвращены запросом. Он не сможет масштабироваться намного дальше 600 сайтов.