Этот следующий скрипт предоставит вам необходимый вывод, но я не уверен, что это лучший метод или нет. Но это наверняка даст простор для размышлений -
SELECT C.A CustomerID,
MAX(C.[TOP 1]) [TOP-1],SUM(C.[TOP 1 PRICE]) [TOP-1-PRICE],
MAX(C.[TOP 2]) [TOP-2],SUM(C.[TOP 2 PRICE]) [TOP-2-PRICE],
MAX(C.[TOP 3]) [TOP-3],SUM(C.[TOP 3 PRICE]) [TOP-3-PRICE]
FROM (
SELECT B.A,
CASE WHEN DR = 1 THEN B.C ELSE NULL END AS [TOP 1],
CASE WHEN DR = 1 THEN B.B ELSE NULL END AS [TOP 1 PRICE],
CASE WHEN DR = 2 THEN B.C ELSE NULL END AS [TOP 2],
CASE WHEN DR = 2 THEN B.B ELSE NULL END AS [TOP 2 PRICE],
CASE WHEN DR = 3 THEN B.C ELSE NULL END AS [TOP 3],
CASE WHEN DR = 3 THEN B.B ELSE NULL END AS [TOP 3 PRICE]
FROM (
SELECT A,b,c,
DENSE_RANK() over(PARTITION BY a order by B desc) DR
FROM (
VALUES
(1,100,'TV',1),
(2,50,'Coffee',1),
(1,70,'PC',2),
(3,30,'Clothes',1),
(1,60,'Games',3),
(1,50,'Drinks',4)
) V (A,b,c,D)
)B
WHERE DR <4
)C
GROUP BY C.A