Je kunt gebruik GROUP BY SalesOrderID
. Het verschil is dat u met GROUP BY alleen de geaggregeerde waarden kunt hebben voor de kolommen die niet zijn opgenomen in GROUP BY.
Als u daarentegen aggregatiefuncties in vensters gebruikt in plaats van GROUP BY, kunt u zowel geaggregeerde als niet-geaggregeerde waarden ophalen. Dat wil zeggen, hoewel u dat niet doet in uw voorbeeldquery, zou u zowel individuele OrderQty
kunnen ophalen waarden en hun sommen, tellingen, gemiddelden enz. over groepen van dezelfde SalesOrderID
v.
Hier is een praktisch voorbeeld van waarom vensteraggregaten geweldig zijn. Stel dat u moet berekenen welk percentage van een totaal elke waarde is. Zonder vensteraggregaten zou u eerst een lijst met geaggregeerde waarden moeten afleiden en deze vervolgens weer samenvoegen met de oorspronkelijke rijenset, d.w.z. als volgt:
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]
Kijk nu hoe u hetzelfde kunt doen met een aggregaat met vensters:
SELECT
[Partition],
Value,
Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig
Veel gemakkelijker en schoner, nietwaar?