Има по-лесно решение:
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;
Не съм сигурен защо или дали това ограничение е в стандарта SQL '92. Наистина го запомних доста добре преди около 20 години, но не си спомням това конкретно ограничение.
Трябва да отбележа:
- По времето на стандарта SQL 92 страничните съединявания всъщност не бяха на радара. Sybase определено нямаше такава концепция.
- Други бази данни правят имат проблеми с външни препратки. По-специално, те често ограничават обхвата до едно ниво.
- Самият SQL стандарт е по-скоро политически (т.е. управляван от доставчика), отколкото управляван от действителните потребителски изисквания на базата данни. Е, с времето се движи в правилната посока.