在聚合查询中使用列 (Visual Database Tools)

适用于:SQL Server

创建聚合查询时, 查询和视图设计器工具(Visual Database Tools) 会做出某些假设,以便它可以构造有效的查询。 例如,如果要创建聚合查询并标记要输出的数据列,则查询和视图设计器会自动使子句的 GROUP BY 列部分,以免无意中尝试在摘要中显示单个行的内容。

使用分组依据

查询和视图设计器在处理列时使用以下原则:

  • 选择“分组依据”选项或向查询添加聚合函数时,标记为输出或用于排序的所有列将自动添加到 GROUP BY 子句中。 如果列已是聚合函数的一部分,则不会自动添加到 GROUP BY 子句中。

    如果不希望特定列成为子句的 GROUP BY 一部分,则必须通过在“条件”窗格的“分组依据”列中选择其他选项来手动更改它。 但是,查询和视图设计器不会阻止你选择可能导致查询未运行的选项。

  • 如果在“条件”或“SQL”窗格中手动将查询输出列添加到聚合函数,则查询和视图设计器不会自动从查询中删除其他输出列。 因此,必须从查询输出中删除其余列,或将它们作为子句或聚合函数的一部分 GROUP BY

在“条件”窗格的“筛选器”列中输入搜索条件时,查询和视图设计器遵循以下规则:

  • 如果未显示网格的 “分组依据 ”列(因为尚未指定聚合查询),则搜索条件将放入 WHERE 子句中。

  • 如果已在聚合查询中,并且已选择“分组依据”列中的选项,则搜索条件将WHERE放入子句中。

  • 如果 Group By 列包含 除 Where 以外的任何值,则搜索条件将放置在子句中 HAVING

使用 HAVING 和 WHERE 子句

以下原则介绍如何在搜索条件中引用聚合查询中的列。 通常,可以使用搜索条件中的列来筛选应汇总的行(a WHERE 子句),或确定最终输出(a HAVING 子句)中显示的分组结果。

  • 单个数据列可以出现在或HAVING子句中WHERE,具体取决于查询中其他地方如何使用它们。

  • WHERE 子句用于选择行子集进行汇总和分组,因此在完成任何分组之前应用。 因此,即使在子句中不是子句的GROUP BY一部分或包含在聚合函数中,也可以使用该子句中的数据列WHERE。 例如,以下语句选择成本超过 10.00 美元的所有游戏,并平均价格:

    SELECT AVG(price)
    FROM titles
    WHERE price > 10;
    
  • 如果创建涉及子句或聚合函数中 GROUP BY 也使用的列的搜索条件,则搜索条件可以显示为 WHERE 子句或 HAVING 子句 - 可以在创建条件时确定该条件。 例如,以下语句为每个出版社计算标题的平均价格,然后显示平均价格大于 $10.00 的出版社:

    SELECT pub_id,
           AVG(price)
    FROM titles
    GROUP BY pub_id
    HAVING (AVG(price) > 10);
    
  • 如果在搜索条件中使用聚合函数,则条件涉及摘要,因此必须是子句的 HAVING 一部分。