sql >> Base de Datos >  >> RDS >> PostgreSQL

SQL Server:agregación condicional con correlación

Hay una solución más fácil:

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;

No estoy seguro de por qué o si esta limitación está en el estándar SQL '92. Lo tenía bastante bien memorizado hace unos 20 años, pero no recuerdo esa limitación en particular.

Debo señalar:

  • En el momento del estándar SQL 92, las uniones laterales no estaban realmente en el radar. Sybase definitivamente no tenía ese concepto.
  • Otras bases de datos hacen tienen problemas con las referencias externas. En particular, a menudo limitan el alcance a un nivel de profundidad.
  • El estándar SQL en sí mismo tiende a ser altamente político (es decir, impulsado por el proveedor) en lugar de estar impulsado por los requisitos reales del usuario de la base de datos. Bueno, con el tiempo, se mueve en la dirección correcta.