Partager via


Utiliser des colonnes dans des requêtes d’agrégation (Visual Database Tools)

s’applique à : SQL Server

Lorsque vous créez des requêtes agrégées, les outils du Concepteur de requêtes et de vues (Visual Database Tools) effectuent certaines hypothèses afin qu’elles puissent construire une requête valide. Par exemple, si vous créez une requête d’agrégation et marquez une colonne de données pour la sortie, le Concepteur de requêtes et de vues effectue automatiquement la partie colonne de la GROUP BY clause afin de ne pas tenter par inadvertance d’afficher le contenu d’une ligne individuelle dans un résumé.

Utiliser le groupe par

Le Concepteur de requêtes et de vues utilise les instructions suivantes pour l’utilisation des colonnes :

  • Lorsque vous choisissez l’option Group By ou ajoutez une fonction d’agrégation à une requête, toutes les colonnes marquées pour la sortie ou utilisées pour le tri sont automatiquement ajoutées à la GROUP BY clause. Les colonnes ne sont pas automatiquement ajoutées à la GROUP BY clause si elles font déjà partie d’une fonction d’agrégation.

    Si vous ne souhaitez pas qu’une colonne particulière fait partie de la GROUP BY clause, vous devez la modifier manuellement en sélectionnant une autre option dans la colonne Group By du volet Critères. Toutefois, le Concepteur de requêtes et de vues n’empêche pas de choisir une option qui peut entraîner une requête qui ne s’exécute pas.

  • Si vous ajoutez manuellement une colonne de sortie de requête à une fonction d’agrégation dans le volet Critères ou SQL, le Concepteur de requêtes et de vues ne supprime pas automatiquement d’autres colonnes de sortie de la requête. Par conséquent, vous devez supprimer les colonnes restantes de la sortie de requête ou les faire partie de la GROUP BY clause ou d’une fonction d’agrégation.

Lorsque vous entrez une condition de recherche dans la colonne Filtrer du volet Critères, le Concepteur de requêtes et de vues suit les règles suivantes :

  • Si la colonne Group By de la grille n’est pas affichée (car vous n’avez pas encore spécifié de requête d’agrégation), la condition de recherche est placée dans la WHERE clause.

  • Si vous êtes déjà dans une requête d’agrégation et que vous avez sélectionné l’option Where dans la colonne Group By , la condition de recherche est placée dans la WHERE clause.

  • Si la colonne Group By contient une valeur autre que Where, la condition de recherche est placée dans la HAVING clause.

Utiliser les clauses HAVING et WHERE

Les principes suivants décrivent comment vous pouvez référencer des colonnes dans une requête d’agrégation dans des conditions de recherche. En général, vous pouvez utiliser une colonne dans une condition de recherche pour filtrer les lignes qui doivent être résumées (une WHERE clause) ou déterminer les résultats groupés qui apparaissent dans la sortie finale (une HAVING clause).

  • Les colonnes de données individuelles peuvent apparaître dans la ou HAVING la WHERE clause, selon la façon dont elles sont utilisées ailleurs dans la requête.

  • WHERE les clauses sont utilisées pour sélectionner un sous-ensemble de lignes pour résumer et regrouper et sont donc appliquées avant l’opération d’un regroupement. Par conséquent, vous pouvez utiliser une colonne de données dans une WHERE clause même si elle ne fait pas partie de la GROUP BY clause ou contenue dans une fonction d’agrégation. Par exemple, l’instruction suivante sélectionne tous les titres qui coûtent plus de 10,00 $ et moyenne le prix :

    SELECT AVG(price)
    FROM titles
    WHERE price > 10;
    
  • Si vous créez une condition de recherche qui implique une colonne également utilisée dans une clause ou une GROUP BY fonction d’agrégation, la condition de recherche peut apparaître sous la forme d’une WHERE clause ou d’une HAVING clause. Vous pouvez décider quel moment vous créez la condition. Par exemple, l’instruction suivante crée un prix moyen pour les titres de chaque éditeur, puis affiche la moyenne pour les éditeurs dans lesquels le prix moyen est supérieur à 10,00 $ :

    SELECT pub_id,
           AVG(price)
    FROM titles
    GROUP BY pub_id
    HAVING (AVG(price) > 10);
    
  • Si vous utilisez une fonction d’agrégation dans une condition de recherche, la condition implique un résumé et doit donc faire partie de la HAVING clause.