Jest prostsze rozwiązanie:
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;
Nie jestem pewien, dlaczego i czy to ograniczenie jest w standardzie SQL '92. Znałem to całkiem dobrze 20 lat temu, ale nie pamiętam tego konkretnego ograniczenia.
Powinienem zauważyć:
- W czasach standardu SQL 92 sprzężenia boczne nie były tak naprawdę widoczne. Sybase zdecydowanie nie miało takiej koncepcji.
- Inne bazy danych do mieć problemy z odnośnikami zewnętrznymi. W szczególności często ograniczają zakres do jednego poziomu głębokości.
- Sam standard SQL jest raczej polityczny (tj. oparty na dostawcy), niż wynikający z rzeczywistych wymagań użytkownika bazy danych. Cóż, z biegiem czasu zmierza we właściwym kierunku.