Có một giải pháp dễ dàng hơn:
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;
Tôi không chắc tại sao hoặc liệu giới hạn này có nằm trong tiêu chuẩn SQL '92 hay không. Tôi đã ghi nhớ nó khá tốt cách đây 20 năm, nhưng tôi không nhớ lại giới hạn cụ thể đó.
Tôi cần lưu ý:
- Vào thời điểm của tiêu chuẩn SQL 92, các phép nối bên không thực sự có trên radar. Sybase chắc chắn không có khái niệm như vậy.
- Cơ sở dữ liệu khác do có vấn đề với các tham chiếu bên ngoài. Đặc biệt, họ thường giới hạn phạm vi sâu đến một mức.
- Bản thân Tiêu chuẩn SQL có xu hướng mang tính chính trị cao (nghĩa là do nhà cung cấp điều khiển) hơn là do các yêu cầu thực tế của người dùng cơ sở dữ liệu. Theo thời gian, nó luôn đi đúng hướng.