Er is een eenvoudigere oplossing:
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;
Ik weet niet zeker waarom of of deze beperking in de SQL '92-standaard zit. Ik heb het ongeveer 20 jaar geleden redelijk goed onthouden, maar ik herinner me die specifieke beperking niet.
Ik moet opmerken:
- Ten tijde van de SQL 92-standaard waren laterale verbindingen niet echt op de radar. Sybase had zo'n concept absoluut niet.
- Andere databases doen problemen hebben met uiterlijke referenties. In het bijzonder beperken ze de scoping vaak tot één niveau diep.
- De SQL-standaard zelf neigt eerder naar politiek (dat wil zeggen door de leverancier gestuurd) in plaats van door de daadwerkelijke vereisten van de databasegebruiker. Na verloop van tijd gaat het wel de goede kant op.