Il existe une solution plus simple :
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;
Je ne sais pas pourquoi ou si cette limitation est dans la norme SQL '92. Je l'avais assez bien mémorisé il y a environ 20 ans, mais je ne me souviens pas de cette limitation particulière.
Je dois noter :
- À l'époque de la norme SQL 92, les jointures latérales n'étaient pas vraiment sur le radar. Sybase n'avait définitivement pas un tel concept.
- D'autres bases de données font ont des problèmes avec les références externes. En particulier, ils limitent souvent la portée à un niveau de profondeur.
- La norme SQL elle-même a tendance à être hautement politique (c'est-à-dire axée sur le fournisseur) plutôt que sur les besoins réels des utilisateurs de bases de données. Eh bien, avec le temps, cela évolue dans la bonne direction.