适用于: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一部分。