Sie können Verwenden Sie GROUP BY SalesOrderID
. Der Unterschied besteht darin, dass Sie mit GROUP BY nur die aggregierten Werte für die Spalten haben können, die nicht in GROUP BY enthalten sind.
Im Gegensatz dazu können Sie mit fensterbasierten Aggregatfunktionen anstelle von GROUP BY sowohl aggregierte als auch nicht aggregierte Werte abrufen. Das heißt, obwohl Sie dies in Ihrer Beispielabfrage nicht tun, könnten Sie beide einzelne OrderQty
abrufen Werte und deren Summen, Zählungen, Durchschnittswerte etc. über Gruppen gleicher SalesOrderID
s.
Hier ist ein praktisches Beispiel dafür, warum gefensterte Aggregate großartig sind. Angenommen, Sie müssen berechnen, wie viel Prozent einer Gesamtsumme jeder Wert ausmacht. Ohne gefensterte Aggregate müssten Sie zuerst eine Liste von aggregierten Werten ableiten und sie dann wieder mit dem ursprünglichen Rowset verbinden, z. B. so:
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]
Sehen Sie sich nun an, wie Sie dasselbe mit einem Fenster-Aggregat tun können:
SELECT
[Partition],
Value,
Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig
Viel einfacher und sauberer, nicht wahr?