Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

La clause SQL OVER() - quand et pourquoi est-elle utile ?

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 ?