Я был бы склонен разворачивать категории и затем агрегировать:
select which, name, sum(price)
from products p cross apply
(values ('productName', productName),
('groupName', groupName),
('parentGroup', parentGroup)
) v(which, name) left join
productsales ps
on ps.productId = p.productId
group by which, name;