Ada solusi yang lebih mudah:
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;
Saya tidak yakin mengapa atau apakah batasan ini ada dalam standar SQL '92. Saya telah mengingatnya dengan cukup baik sekitar 20 tahun yang lalu, tetapi saya tidak mengingat batasan khusus itu.
Saya harus mencatat:
- Pada saat standar SQL 92, penggabungan lateral tidak benar-benar diperhatikan. Sybase jelas tidak memiliki konsep seperti itu.
- Basis data lain lakukan memiliki masalah dengan referensi luar. Secara khusus, mereka sering membatasi pelingkupan hingga satu tingkat saja.
- Standar SQL itu sendiri cenderung sangat politis (yaitu, didorong oleh vendor) daripada didorong oleh kebutuhan pengguna basis data yang sebenarnya. Nah, seiring waktu, ia bergerak ke arah yang benar.