sql >> Database >  >> RDS >> PostgreSQL

SQL Server - voorwaardelijke aggregatie met correlatie

Er is een eenvoudigere oplossing:

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;

Ik weet niet zeker waarom of of deze beperking in de SQL '92-standaard zit. Ik heb het ongeveer 20 jaar geleden redelijk goed onthouden, maar ik herinner me die specifieke beperking niet.

Ik moet opmerken:

  • Ten tijde van de SQL 92-standaard waren laterale verbindingen niet echt op de radar. Sybase had zo'n concept absoluut niet.
  • Andere databases doen problemen hebben met uiterlijke referenties. In het bijzonder beperken ze de scoping vaak tot één niveau diep.
  • De SQL-standaard zelf neigt eerder naar politiek (dat wil zeggen door de leverancier gestuurd) in plaats van door de daadwerkelijke vereisten van de databasegebruiker. Na verloop van tijd gaat het wel de goede kant op.


  1. Hoe de gegevens van Excel naar Oracle te kopiëren?

  2. Hoe kan ik een UPDATE-instructie doen met JOIN in SQL Server?

  3. Waarom Cassandra leren met Hadoop?

  4. SQLCipher gebruiken met Android