sql >> Databáze >  >> RDS >> PostgreSQL

SQL Server - podmíněná agregace s korelací

Existuje jednodušší řešení:

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;

Nejsem si jistý, proč nebo zda je toto omezení ve standardu SQL '92. Měl jsem to docela dobře nazpaměť asi před 20 lety, ale nevzpomínám si na to konkrétní omezení.

Měl bych poznamenat:

  • V době standardu SQL 92 nebyly boční spoje ve skutečnosti na radaru. Sybase takový koncept rozhodně neměl.
  • Jiné databáze dělají mají problémy s vnějšími referencemi. Zejména často omezují rozsah na jednu úroveň hluboko.
  • Samotný standard SQL má tendenci být vysoce politický (tj. řízený dodavatelem), spíše než skutečnými požadavky uživatelů databáze. No, časem se to pohne správným směrem.


  1. Jak zkontrolovat, která funkce používá typ?

  2. Chyba vývojáře SQL s deaktivací modulů a pokračujte

  3. Jaké jsou způsoby vkládání a načítání dat BLOB z databáze Oracle pomocí SQL?

  4. 2018 Recenze:7 milníků MariaDB, které jste možná zmeškali