本文介绍如何使用 Access 中的最高值查询查找一组记录中的最高值或最低值。 使用最高价值查询来回答各种业务问题,例如哪些产品销售良好,哪些产品卖得不好。
您要做什么?
了解最高值查询
当需要查找表字段中包含顶部或底部值的记录时,可以使用 top 值查询。 可以使用最高值查询来回答以下类型的问题。
-
哪个是最贵或最昂贵的产品?
-
哪三个员工过下一个生日?
-
哪些部门在本年度的销售额最大或最少?
-
哪些产品占销售额的百分之五?
-
每个产品类别中的哪些产品占销售额的前 5% 或倒数百分之五?
简言之,top-values 查询将进行排序,然后筛选数据以返回字段中的顶部或底部值。 可以使用最高值查询来搜索数字 (包括货币) 和日期值。
创建最高值查询的过程遵循以下广泛的步骤:
-
Create选择查询或总计查询。
使用选择查询查找表中的顶部或底部值。 使用总计查询查找一个或多个类别中的顶部或底部值。 例如,如果要回答“什么是最昂贵的产品或最便宜的产品”之类的问题,请首先创建一个选择查询。 若要回答诸如“我们每个产品类别中的哪些产品占销售额的百分之五”之类的问题,请使用总计查询。 此外,可以使用任一类型的查询来查找属于类别的一组记录或记录中的顶部和底部值。
-
对查询应用排序顺序。
-
将其他条件应用于查询。
-
指定希望查询返回的记录数。 可以指定百分比(例如字段中值的前 5%),也可以指定固定数字,例如字段中的前 10 个值。
在顶部值查询和筛选器之间进行选择
若要确定是应创建 top 值查询还是应用筛选器,请考虑以下事项:
-
如果要返回包含字段中最高值或最低值的记录,并且不知道 (确切的顶部或底部字段值,或者它们与) 无关紧要,请创建一个 top 值查询。
-
如果要返回字段中的值匹配或小于或大于您感兴趣的值的所有记录,请应用筛选器。 例如,若要查看价格介于 50 美元和 100 美元之间的产品,请应用筛选器。 下图演示了查询“设计”视图中的示例筛选器,以及此类筛选器可以产生的结果:
有关创建和使用筛选器的详细信息,请参阅 应用筛选器以查看 Access 数据库中的选定记录一文。
用于创建和使用最高值查询的规则
继续操作时,请记住,无论选择查询 (查询类型还是总查询) ,都必须使用包含描述性数据的字段(例如员工或产品名称),以及包含要查找的顶部或底部值的字段,例如价格或日期字段。 可以使用多个数据字段,如果使用总计查询,则数据字段通常应包含类别信息,例如城市或国家/地区字段。 仅当创建针对所有记录运行的总计查询时,才能省略类别数据,例如“向我显示最昂贵的订单的前 5%”。 此外,可以使用选择查询或总计查询查找一组记录或属于类别的记录中的顶部和底部值。 有关执行此操作的详细信息,请参阅本文后面的 查找类别或组中记录的顶部或底部值部分。
查找包含顶部或底部值的记录
本部分中的步骤说明如何创建基本顶部值查询和更高级的查询。 第一步演示顶值查询的基本部分,第二部分说明如何查找接下来的几个员工生日。 这些步骤使用以下示例表:
姓氏 |
名字 |
地址 |
城市 |
国家/地区 |
出生日期 |
雇用日期 |
刘鹏 |
Josh |
1 Main St. |
New York |
USA |
1968 年 2 月 5 日 |
1994 年 6 月 10 日 |
Heloo |
瓦利德 |
52 1st St. |
Boston |
USA |
1957 年 5 月 22 日 |
1996 年 11 月 22 日 |
Guido |
潘杰 |
3122 75th Ave. S.W. |
Seattle |
USA |
1960 年 11 月 11 日 |
2000 年 3 月 11 日 |
百吉饼 |
让·菲利普 |
1 Contoso Blvd. |
London |
英国 |
1964 年 3 月 22 日 |
1998 年 6 月 22 日 |
价格 |
朱利安 |
Calle Smith 2 |
墨西哥城 |
墨西哥 |
05-Jun-1972 |
2002 年 1 月 5 日 |
休斯 |
克莉 丝 汀 |
3122 75th St. S. |
Seattle |
USA |
1970 年 1 月 23 日 |
1999 年 4 月 23 日 |
莱利 |
史蒂夫 |
67 Big St. |
Tampa |
USA |
1964 年 4 月 14 日 |
2004 年 10 月 14 日 |
Birkby |
Dana |
2 鼻子 Pkwy |
珠海 |
USA |
1959 年 10 月 29 日 |
1997 年 3 月 29 日 |
百吉饼 |
让·菲利普 |
1 Contoso Blvd. |
London |
英国 |
1964 年 3 月 22 日 |
1998 年 6 月 20 日 |
如果需要,可以手动输入此示例表中的数据,也可以将此表复制到电子表格程序(如 Microsoft Excel),然后将生成的工作表导入到 Access 中的表中。
注意: 如果没有电子表格程序,可以将示例数据复制到文本编辑器(如记事本)。 有关导入文本数据的详细信息,请参阅在 文本文件中导入或链接到数据一文。
Create基本顶部值查询
-
在“创建”选项卡上的“查询”组中,单击“查询设计”。
-
单击要在查询中使用的表,单击“ 添加 ”将表置于设计网格中,然后单击“ 关闭”。
-或 -双击表。 如果使用示例数据,请将 Employees 表添加到查询。 -
将要在查询中使用的字段添加到设计网格。 可以双击每个字段,或将每个字段拖放到 “字段 ”行的空白单元格上。
如果使用示例表,请添加“名字”、“姓氏”和“出生日期”字段。 -
在包含“出生日期”字段 (顶部或底部值的字段中,如果使用示例表) ,请单击“ 排序” 行并选择 “升序 ”或“ 降序”。
如果值字段包含数字(如价格或销售数字), 则升序 排序顺序返回最小值, 降序 排序顺序返回最大值。 如果值字段包含日期, 则降序 排序顺序返回最近的日期,而 Ascending 返回最早的日期。重要: 必须仅针对包含顶部或底部值的字段将 “排序” 行设置为 “升序 ”或“ 降序 ”。 如果为包含顶部或底部值的字段以外的字段(例如 ProductName 而不是 Price)指定排序顺序,则查询不会返回所需的结果。
-
在“ 设计 ”选项卡上的“ 查询设置” 组中,单击 返回 (“ 热门值 ”列表) 旁边的向下箭头,然后输入要查看的记录数或百分比,或从列表中选择一个选项。
-
单击“ 运行 ”以运行查询并在“数据表”视图中显示结果。
-
保存查询并使其保持打开状态,以便在后续步骤中使用。
可以看到,这种类型的顶级值查询可以回答基本问题,例如谁是公司中最老或最年轻的人。 后续步骤说明如何使用表达式和其他条件为查询增加功能和灵活性。 下一步中显示的条件返回接下来的三个员工生日。
向查询添加条件
注意: 这些步骤假定你将使用上一部分中所述的查询。
-
在“设计”视图中打开在前面步骤中创建的查询。
-
在查询设计网格中,在“出生日期”列右侧的列中,复制并粘贴或键入表达式 Expr1: DatePart (“m”,[出生日期]) 。 DatePart 函数提取“出生日期”字段中值的月份部分。
-
在包含表达式的列右侧,复制并粘贴或键入表达式 Expr2: DatePart (“d”,[出生日期]) 。 在这种情况下, DatePart 函数提取“出生日期”字段中值的日期部分。
-
清除每个表达式的“显示”行中的检查框,然后单击每个表达式的“排序”单元格,然后选择“升序”。
-
(可选)可以指定条件来限制查询的范围。 指定条件时,查询仅对满足条件的记录进行排序,并从排序列表中标识顶部或底部字段值。
若要继续使用示例数据,请在“出生日期”字段的 “条件” 行中,键入或复制并粘贴此表达式:Month ([Birth Date]) > Month (Date () ) or Month ([Birth Date]) = Month (Date () ) and day ([Birth Date]) >Day (Date () )
此表达式执行以下操作: Month ([BirthDate]) > Month (Date () ) 部分检查每个员工的出生日期,以查看它是否位于未来月份,如果为 true,则包括查询中的这些记录。 表达式的 Month ([BirthDate]) = Month (Date () ) and Day ([BirthDate]) >Day (Date () ) 部分检查当前月份中出现的出生日期,以查看出生日期是否位于当前日期之前或之后。 如果该条件为 true,则函数在查询结果中包括这些记录。 总之,此表达式将忽略出生日期介于 1 月 1 日和运行查询的日期之间的任何记录。
若要查看查询条件表达式的更多示例,请参阅 查询条件示例一文。
-
在“ 设计 ”选项卡上的“ 查询设置” 组中,单击 返回 (“ 热门值 ”列表) 旁边的向下箭头,然后输入要查看的记录数或百分比,或从列表中选择一个选项。
-
单击“ 运行 ”以运行查询并在“数据表”视图中显示结果。
如果查询返回的记录数超过预期
如果数据包含共享日期值的记录,则最高值查询可能会返回比预期更多的数据。 例如,可以设计一个顶值查询来检索三个员工记录,但实际上会看到四条,因为“Wilson”和“Edwards”共享生日。 无论有多少记录具有这些值,这种类型的查询都会返回所有顶级值。 若要排除重复值,可以将名为 “唯一值” 的属性设置为 “是”。 有关使用该属性的信息,请参阅本文后面的 如果看到重复记录部分。
LastName |
BirthDate |
约翰逊 |
9/26/1968 |
康 |
10/2/1970 |
爱德华兹 |
10/15/1965 |
威尔逊 |
10/15/1969 |
如果查询返回的记录数少于预期
假设你设计了一个查询以返回字段中的前五条或倒数五条记录,但只看到其中三条记录。 通常,可以通过在“设计”视图中打开查询并在设计网格的 “条件” 行中查看比预期限制性更高的条件来解决此类问题。 有关条件的详细信息,请参阅 查询条件的示例一文。
如果看到重复记录
如果 top 值查询返回重复项,则基础表包含重复记录,或记录显示为重复项,因为查询不包括可以区分记录的字段。 例如,下面的查询显示最近发货的五个订单,以及处理事务的销售人员的姓名。
ShippedDate |
销售人员 |
11/12/2004 |
丰塔纳 |
11/12/2004 |
莫雷诺 |
10/12/2004 |
Osada |
10/12/2004 |
Osada |
10/12/2004 |
丰塔纳 |
第三条和第四条记录似乎是重复的,但可能是因为销售人员奥萨达处理了同一天发货的两个不同的订单。
根据你的要求,你可以执行以下两项操作之一,以避免返回重复记录。 可以更改查询的设计以添加有助于区分记录的字段,例如 OrderID 和 CustomerID 字段。 或者,如果只看到一个重复记录,则可以通过将查询的 “唯一值 属性”设置为“ 是”来仅显示非重复记录。 若要设置此属性,请在“查询设计”视图中按 F4 显示查询的属性表,找到 “唯一值” 属性并将其设置为 “是”。
有关处理重复记录的详细信息,请参阅使用 查询查找重复记录一文。
查找类别或组中记录的顶部或底部值
通过创建总计查询,可找到属于组的记录的顶部或底部值。 继续操作时,请记住,默认情况下,总计查询只能包含包含组数据的一个或多个字段,例如“类别”字段,以及具有顶部或底部值的字段,例如“price”字段。 总计查询不能包含描述类别中项的其他字段。 但是,可以创建第二个查询,其中包含总计查询中的字段,以及包含描述性数据的其他表中的字段。
例如,假设你有一个产品表,并且将每个产品分配到一个类别,例如棋盘游戏、拼图等。 如果创建总计查询来标识每个类别中最昂贵的产品,则查询只能包含包含类别数据的字段和包含价格数据的字段。 对于此示例,假设一个名为“类别名称”的字段和一个名为“价格”的字段。 运行此类型的查询时,Access 会追加“MaxOf”或“MinOf” (,具体取决于在“价格”字段开头选择) 的函数,如下所示:
Category Name |
MaxOfPrice |
棋盘游戏 |
$55.00 |
拼图 |
$43.90 |
计算机游戏 |
$263.50 |
Dolls |
$81.00 |
... |
... |
总计查询不能包含有助于描述产品 (从而使数据更易于理解) 的其他字段,例如产品名称或供应商名称,如下所示:
Category Name |
MaxOfPrice |
产品名称 |
供应商名称 |
棋盘游戏 |
$55.000 |
使用 C++ 的乐趣 |
Proseware, Inc. |
拼图 |
$43.90 |
关系数据库关系图 |
Lucerne Publishing |
计算机游戏 |
$263.50 |
计算机极客和神话生物 |
Litware, Inc. |
Dolls |
$81.00 |
程序员操作图 |
Contoso, Ltd |
... |
... |
... |
... |
如果想要查看该描述性数据,可以创建第二个选择查询,该查询将汇总查询中的字段与其他数据字段组合在一起。
本节中的步骤说明如何创建总计查询并选择所需的查询,以识别每组类别中最昂贵的产品。 这些步骤假定使用以下示例表:
“类别”表
CategoryID |
Category Name |
说明 |
1 |
棋盘游戏 |
所有年龄和技能水平 |
2 |
拼图 |
拼图, 单词拼图, 益智玩具 |
3 |
计算机游戏 |
所有主机和技能级别 |
4 |
Dolls |
动作人物, 时尚娃娃 |
5 |
运动器材 |
球、衣服、网 |
6 |
模型/爱好 |
飞机、汽车、火车 |
供应商表
SupplierID |
供应商名称 |
1 |
Fabrikam |
2 |
Tailspin Toys |
3 |
Northwind Traders |
4 |
嘉元实业 |
5 |
Lucerne Publishing |
6 |
Proseware, Inc. |
7 |
Contoso, Ltd |
8 |
Wide World Importers |
9 |
Wingtip Toys |
10 |
Wide World Importers |
11 |
Litware, Inc. |
1.2 |
Southridge Video |
“产品”表
产品名称 |
SupplierID |
CategoryID |
价格 |
程序员操作图 |
7 |
4 |
$12.95 |
使用 C++ 的乐趣 |
6 |
1 |
$15.85 |
关系数据库关系图 |
5 |
2 |
$22.50 |
神奇的计算机芯片 |
3 |
2 |
$32.65 |
访问! 游戏! |
1 |
1 |
$22.95 |
计算机极客和神话生物 |
11 |
3 |
$78.50 |
计算机极客练习! The DVD! |
4 |
5 |
$14.88 |
Ultimate飞披萨 |
2 |
5 |
$36.75 |
外部 5.25 英寸软盘驱动器 (1/4 缩放) |
8 |
6 |
$65.00 |
经理非操作图 |
9 |
4 |
$78.88 |
黑暗 |
1.2 |
3 |
$53.33 |
生成自己的键盘 |
1 |
6 |
$77.95 |
注意: 这些步骤还假定“类别”和“产品”表之间存在一对多关系,以及“供应商”表和“产品”表之间的一对多关系。 在这种情况下,表共享 SupplierID 和 CategoryID 字段。 如果没有关系,下一部分所述的总计查询将无法正常工作。
Create总计查询
-
在“创建”选项卡上的“查询”组中,单击“查询设计”。
-
选择要使用的表,单击“ 添加”,然后在添加完表后单击“ 关闭 ”。
-或 -双击要使用的表,然后单击“ 关闭”。 每个表都显示在设计网格中。 如果使用上面列出的示例表,请添加“类别”和“产品”表。 -
双击要在查询中使用的表字段。
此时,请确保仅将组字段和值字段添加到查询。 如果使用上表中列出的示例数据,请从“类别”表中添加“类别名称”字段,以及“产品”表中的“价格”字段。 -
(可选)可以指定一个条件来限制查询的范围。查询条件示例一文。
仅对符合条件的记录进行排序,并将在此排序列表中标识顶部和底部字段值。 例如,若要排除“运动”类别中的产品,请将此表达式添加到“类别名称”字段的“条件”行: <>“Sports”。 若要查看查询条件表达式的更多示例,请参阅 -
将查询转换为总计查询。
-
在“设计”选项卡上的“显示/隐藏”组中,单击“总计”。
“总计”行显示在设计网格中。
-
-
确保每个组字段的 “Total ”单元格设置为“ 分组依据”,然后将值字段的 “Total ”单元格 (包含) 顶部或底部值的字段设置为 “最大值 ”或“ 最小值”。
选择 “最大值 ”将返回数值字段中的最大值,并在“日期/时间”字段中返回最近的日期或时间值。 选择 “最小值 ”返回数值字段中的最小值,在“日期/时间”字段中返回最早的日期或时间值。 如果使用示例数据,请将“类别名称”字段的 “汇总 ”单元格设置为 “分组依据”,将“价格”字段的“ 总计 ”单元格设置为 “最大值 ”或“ 最小值”。 -
在“ 设计 ”选项卡上的“ 工具” 组中,确保“ 返回 ”列表设置为“ 全部”,然后单击“ 运行 ”以运行查询并在“数据表”视图中显示结果。
注意: 根据在步骤 7 中选择的函数,Access 会将查询中值字段的名称更改为 MaxOfFieldName 或 MinOfFieldName。 如果使用示例表,Access 将重命名字段 MaxOfPrice 或 MinOfPrice。
-
保存查询并转到后续步骤。
查询不返回产品名称或有关产品的任何其他信息。 若要查看其他数据,需要创建第二个查询来合并刚刚创建的查询。 后续步骤说明如何创建第二个查询。
Create第二个查询以查看更多数据
-
在“创建”选项卡上的“查询”组中,单击“查询设计”。
-
单击“ 查询 ”选项卡,然后双击在上一部分创建的总计查询。
-
单击“ 表 ”选项卡,添加总计查询中使用的表,以及包含要查看的其他相关数据的任何表。
如果使用前面列出的示例表,请将“类别”、“产品”和“供应商”表添加到新查询。 -
将总计查询中的字段联接到父表中的相应字段。 为此,请将总计查询中的每个字段拖动到表中的相应字段。
如果使用示例数据,请将总计查询中的“类别名称”字段拖动到 Categories 表中的“类别名称”字段。 然后,将总计查询中的 MaxOfPrice 字段拖动到“产品”表中的“价格”字段。 联接使新的选择查询能够将总计查询中的数据与其他表中的数据合并在一起。
-
在总计查询的窗口中,双击星号以将整个查询添加到设计网格,然后拖动查询中其他表中的附加字段。
如果使用示例表,请双击在上一部分创建的总计查询,然后分别从“产品”和“供应商”表中添加“产品名称”和“供应商”字段。
-
(可选)为一个或多个列指定排序顺序。
例如,若要按字母顺序列出类别,请将“类别名称”列的 “排序 ”单元格设置为 “升序”。 -
在“设计”选项卡上的“结果”组中,单击“运行”。
这会运行查询并在数据表视图中显示结果。
提示: 如果不希望“价格”列的标题显示为 “MaxOfPrice” 或“ MinOfPrice”,请在“设计”视图中打开查询,然后在网格的“价格”列中,键入 “Price: MaxOfPrice ”或 “Price: MinOfPrice”。 这样做会使 Price 显示为数据表视图中列的标题。
查找包含顶部和底部值的记录
在本文前面创建的查询可以返回顶部或底部值,但不能同时返回两者。 如果要在单个视图中查看这两组值,则需要创建两个查询(一个用于检索顶部值,另一个用于检索底部值),然后将结果合并并存储在单个表中。
查找顶部和底部值并在表中显示该数据的过程遵循以下广泛的步骤:
-
Create顶部值查询和底部值查询,如果需要对数据进行分组,请创建使用 Min 和 Max 函数的总计查询。
-
将顶部值查询 (或最大总计查询) 转换为生成表查询,并运行此查询以创建新表。
-
将底部值查询 (或最小总计查询) 转换为追加查询,并运行此查询以将记录追加到最高值表中。
这些部分中的步骤介绍了如何创建查询。
注意: 除非数据库经过数字签名或位于受信任位置,否则 Access 会阻止运行此处所述的操作查询。 在尝试创建生成表并追加此处所述的查询之前,请按照第一组步骤启用任何阻止的内容。
启用数据库中的内容
-
在消息栏,单击“启用内容”。
-
再次运行查询。
-
-
Create顶部和底部值查询。
有关创建顶部或底部值查询所需的步骤,请参阅本文前面的 查找具有顶部或底部值的记录部分。 如果需要按类别对记录进行分组,请参阅本文前面的 查找类别或组中记录的顶部或底部值部分。
-
保存每个查询,并保持打开状态,以便在后续步骤中使用。
Create生成表查询
-
在设计视图中打开 top 值查询后:
在“设计”选项卡上的“查询类型”组中,单击“生成表”。
此时将显示“ 生成表 ”对话框。 -
在“ 表名称 ”框中,键入将存储顶部和底部记录的表的名称。 例如,键入 “顶部记录”和“底部记录”,然后单击“ 确定”。
每次运行查询时,查询都会创建一个表,并将顶部值替换为当前数据,而不是在数据表视图中显示结果。 -
保存并关闭查询。
Create追加查询
-
在“设计”视图中打开底部值查询。
-
在“设计”选项卡上的“查询类型”组中,单击“追加”。
-
在“ 追加 ”对话框中,键入在“ 生成表 ”对话框中键入的名称。
例如,键入 “顶部记录”和“底部记录 ”,然后单击“ 确定”。 每次运行查询时,查询都会将记录追加到“顶部记录”和“底部记录”表中,而不是在“数据表”视图中显示结果。 -
保存并关闭查询。
运行查询
现在可以运行这两个查询了。
-
在导航窗格中,双击顶部值查询,然后在消息中单击“ 是 ”。
-
双击“底部值”查询,并在消息中单击“ 是 ”。
-
在数据表视图中打开顶部和底部记录表。