Você deve ser capaz de fazer isso com o operador 'pivot'. Algo assim (embora eu tenha certeza de que estraguei alguns detalhes de ortografia ou sintaxe ...):
select catTitle, [1] as site1, [2] as site2, [3] as site3, [4] as site4, [5] as site5
from (select category.catTitle, equipment.quantity, site.title
from equipment
inner join site
on (equipment.siteid = site.siteid)
inner join category
on (category.catid = equipment.catid)
)
pivot
(
sum (quantity)
for equipment.siteid in ( [1], [2], [3], [4], [5] )
) as pvt
order by pvt.category;
O problema com isso é que você precisa saber o conjunto exato de IDs de site que deseja incluir na consulta. Se você precisar de uma tabela cruzada mais dinâmica (como você pode obter no Excel), precisará gerar o texto da consulta como uma string e usar sp_executesql para executá-lo. No texto gerado, você inclui o máximo de "[1], [2], [3], [4], [5]..." e "[1] como site1, [2] como site2.. ." coisas que você precisa.