Du kan brug GROUP BY SalesOrderID
. Forskellen er, med GROUP BY kan du kun have de aggregerede værdier for de kolonner, der ikke er inkluderet i GROUP BY.
I modsætning hertil kan du ved at bruge aggregerede vinduesfunktioner i stedet for GROUP BY hente både aggregerede og ikke-aggregerede værdier. Det vil sige, selvom du ikke gør det i din eksempelforespørgsel, kan du hente både individuelle OrderQty
værdier og deres summer, antal, gennemsnit osv. over grupper af samme SalesOrderID
s.
Her er et praktisk eksempel på, hvorfor vinduesaggregater er fantastiske. Antag, at du skal beregne, hvor stor en procentdel af hver værdi er. Uden aggregater med vinduer skal du først udlede en liste over aggregerede værdier og derefter forbinde den tilbage til det oprindelige rækkesæt, dvs. sådan her:
SELECT
orig.[Partition],
orig.Value,
orig.Value * 100.0 / agg.TotalValue AS ValuePercent
FROM OriginalRowset orig
INNER JOIN (
SELECT
[Partition],
SUM(Value) AS TotalValue
FROM OriginalRowset
GROUP BY [Partition]
) agg ON orig.[Partition] = agg.[Partition]
Se nu, hvordan du kan gøre det samme med et aggregat med vinduer:
SELECT
[Partition],
Value,
Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig
Meget nemmere og renere, ikke?