sql >> Database teknologi >  >> RDS >> PostgreSQL

SQL Server - betinget aggregering med korrelation

Der er en nemmere løsning:

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;

Jeg er ikke sikker på hvorfor eller om denne begrænsning er i SQL '92-standarden. Jeg huskede det ret godt for 20 år siden, men jeg kan ikke huske den særlige begrænsning.

Jeg skal bemærke:

  • På tidspunktet for SQL 92-standarden var lateral joins ikke rigtig på radaren. Sybase havde bestemt ikke noget sådant koncept.
  • Andre databaser gør har problemer med ydre referencer. Især begrænser de ofte omfanget til et niveau dybt.
  • Selve SQL-standarden har en tendens til at være meget politisk (det vil sige leverandørdrevet) snarere end drevet af faktiske databasebrugerkrav. Nå, med tiden går det i den rigtige retning.


  1. Anskaffelse og installation af Microsoft SQL Server Management Studio

  2. Mekanisme Følger af Oracle, når vi tager hot backup

  3. Postgresql håndhæver unik to-vejs kombination af kolonner

  4. Indsæt det lavest mulige unikke positive heltal på en atomart måde i MySql