Vous pouvez utilisez GROUP BY SalesOrderID
. La différence est qu'avec GROUP BY, vous ne pouvez avoir que les valeurs agrégées pour les colonnes qui ne sont pas incluses dans GROUP BY.
En revanche, en utilisant des fonctions d'agrégation fenêtrées au lieu de GROUP BY, vous pouvez récupérer des valeurs agrégées et non agrégées. Autrement dit, bien que vous ne le fassiez pas dans votre exemple de requête, vous pouvez récupérer à la fois OrderQty
individuel valeurs et leurs sommes, décomptes, moyennes, etc. sur des groupes de même SalesOrderID
s.
Voici un exemple pratique de la raison pour laquelle les agrégats fenêtrés sont formidables. Supposons que vous deviez calculer le pourcentage d'un total correspondant à chaque valeur. Sans les agrégats fenêtrés, vous devriez d'abord dériver une liste de valeurs agrégées, puis la joindre à l'ensemble de lignes d'origine, c'est-à-dire comme ceci :
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]
Maintenant, regardez comment vous pouvez faire la même chose avec un agrégat fenêtré :
SELECT
[Partition],
Value,
Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig
Beaucoup plus simple et plus propre, n'est-ce pas ?