sql >> Databasteknik >  >> RDS >> PostgreSQL

SQL Server - villkorlig aggregering med korrelation

Det finns en enklare 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;

Jag är inte säker på varför eller om denna begränsning finns i SQL '92-standarden. Jag hade det ganska väl memorerat för 20 eller så år sedan, men jag minns inte den speciella begränsningen.

Jag bör notera:

  • Vid tidpunkten för SQL 92-standarden var lateral joins inte riktigt på radarn. Sybase hade definitivt inget sådant koncept.
  • Andra databaser gör har problem med yttre referenser. I synnerhet begränsar de ofta omfattningen till en nivå djup.
  • Själva SQL-standarden tenderar att vara mycket politisk (det vill säga leverantörsdriven) snarare än att drivas av faktiska databasanvändarkrav. Tja, med tiden går det åt rätt håll.


  1. Oracle-frågan är långsam (eller misslyckas) från .NET-appen men är snabb från SQL Developer

  2. Från XML inuti CLOB, till Oracle-tabell med lista över sökvägar

  3. PostgreSQL - GROUP BY-sats eller användas i en aggregerad funktion

  4. Hur exporterar jag frågeresultat till Excel i Oracle SQL Developer?