PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

SQL Server - agrégation conditionnelle avec corrélation

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.