Existe uma solução mais fácil:
SELECT c.Customer, c."User", c."Revenue",
1.0 * Revenue/ NULLIF(c2.sum_total, 0) AS percentage,
1.0 * c2.sum_running / NULLIF(c2.sum_total, 0) AS running_percentage
FROM t c CROSS APPLY
(SELECT SUM(c2.Revenue) AS sum_total,
SUM(CASE WHEN c2.Revenue >= x.Revenue THEN c2.Revenue ELSE 0 END)
as sum_running
FROM t c2 CROSS JOIN
(SELECT c.REVENUE) x
WHERE c."User" = c2."User"
) c2
ORDER BY "User", Revenue DESC;
Não sei por que ou se essa limitação está no padrão SQL '92. Eu tinha isso muito bem memorizado cerca de 20 anos atrás, mas não me lembro dessa limitação específica.
Devo observar:
- Na época do padrão SQL 92, as junções laterais não estavam realmente no radar. A Sybase definitivamente não tinha esse conceito.
- Outros bancos de dados fazem tem problemas com referências externas. Em particular, eles geralmente limitam o escopo a um nível de profundidade.
- O próprio padrão SQL tende a ser altamente político (ou seja, orientado pelo fornecedor) em vez de orientado pelos requisitos reais do usuário do banco de dados. Bem, com o tempo, ele se move na direção certa.