本文介绍如何使用最高值查询和总计查询在一组记录中查找最近或最早的日期。 这可以帮助你回答各种业务问题,例如客户上次下订单时,或者哪个季度是按城市销售的最佳季度。
本文内容
概述
可以使用最高值查询对数据进行排名和查看排名最高的项。 最高值查询是一种选择查询,它从结果顶部返回指定数量或百分比的值,例如,网站上的五个最常用的页面。 可以对任何类型的值使用顶级值查询 - 它们不一定是数字。
如果要在对数据进行排名之前对数据进行分组或汇总,则无需使用最高值查询。 例如,假设你需要查找公司运营的每个城市的给定日期的销售数字。 在这种情况下,城市将成为类别 (你需要查找每个城市) 的数据,因此使用总计查询。
使用最高值查询查找表或记录组中包含最新或最早日期的记录时,可以回答各种业务问题,例如:
- 谁最近销售最多?
- 客户上次下订单是什么时候?
- 球队接下来的三个生日是什么时候?
若要创建最高值查询,请首先创建选择查询。 然后,根据你的问题对数据进行排序 - 无论你是要查找顶部还是底部。 如果需要对数据进行分组或汇总,请将选择查询转换为总计查询。 然后,可以使用聚合函数(如 Max 或 Min )返回最高或最低值,或使用 First 或 Last 返回最早或最晚的日期。
本文假定使用的日期值具有日期/时间数据类型。 如果日期值位于“文本”字段中,则 为 。
考虑使用筛选器而不是顶部值查询
如果考虑到特定的日期,筛选器通常更好。 若要确定是应创建 top 值查询还是应用筛选器,请考虑以下事项:
- 如果要返回日期匹配、早于或晚于特定日期的所有记录,请使用筛选器。 例如,若要查看 4 月至 7 月之间的销售日期,请应用筛选器。
- 如果要返回指定数量的记录,这些记录在字段中具有最近或最近日期,而你不知道确切的日期值,或者它们并不重要,请创建一个前值查询。 例如,若要查看五个最佳销售季度,请使用 top 值查询。
有关创建和使用筛选器的详细信息,请参阅 应用筛选器以查看 Access 数据库中的选定记录一文。
准备要遵循的示例数据以及示例
本文中的步骤使用以下示例表中的数据。
Employees 表
| LastName | 名字 | 地址 | 城市 | CountryOrR egion | 出生日期 | 雇用日期 |
|---|---|---|---|---|---|---|
| 刘鹏 | 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 日 |
EventType 表
| TypeID | 事件类型 |
|---|---|
| 1 | 产品发布 |
| 2 | 公司职能 |
| 3 | 专用函数 |
| 4 | 筹款人 |
| 5 | 贸易展 |
| 6 | 演讲 |
| 7 | 音乐会 |
| 8 | 展览 |
| 9 | 街头交易会 |
“客户”表
| CustomerID | 公司 | 联系人 |
|---|---|---|
| 1 | Contoso, Ltd. 图形 | 乔纳森·哈斯 |
| 2 | Tailspin Toys | 艾伦·亚当斯 |
| 3 | Fabrikam | 卡罗尔·菲利普斯 |
| 4 | Wingtip Toys | Lucio Iallo |
| 5 | A. Datum | 曼达尔·萨曼特 |
| 6 | 嘉元实业 | 布赖恩·伯克 |
| 7 | 设计学院 | 贾卡·斯特尔 |
| 8 | School of Fine Art | Milena Duomanova |
事件表
| 事件 ID | 事件类型 | 客户 | 事件日期 | 价格 |
|---|---|---|---|---|
| 1 | 产品发布 | 康拓工程有限公司 | 4/14/2011 | $10,000 |
| 2 | 公司职能 | Tailspin Toys | 4/21/2011 | ¥80,000 |
| 3 | 贸易展 | Tailspin Toys | 2011-5-1 | $25,000 |
| 4 | 展览 | Graphic Design Institute | 5/13/2011 | ¥45,000 |
| 5 | 贸易展 | 康拓工程有限公司 | 5/14/2011 | $55,000 |
| 6 | 音乐会 | School of Fine Art | 5/23/2011 | ¥120,000 |
| 7 | 产品发布 | A. Datum | 6/1/2011 | ¥150,000 |
| 8 | 产品发布 | Wingtip Toys | 6/18/2011 | ¥210,000 |
| 9 | 筹款人 | 嘉元实业 | 6/22/2011 | $1,300 |
| 10 | 演讲 | Graphic Design Institute | 6/25/2011 | $2,450 |
| 11 | 演讲 | 康拓工程有限公司 | 2011-7-4 | $3,800 |
| 1.2 | 街头交易会 | Graphic Design Institute | 2011-7-4 | ¥55,000 |
注意
本部分中的步骤假定“客户”和“事件类型”表位于“事件”表的一对多关系的“一”端。 在这种情况下,“事件”表共享 CustomerID 和 TypeID 字段。 如果没有这些关系,下一部分所述的总计查询将无法正常工作。
将示例数据粘贴到 Excel 工作表中
- 启动 Excel。 此时会打开一个空工作簿。
- 按 SHIFT+F11 插入工作表, (需要四个) 。
- 将每个示例表中的数据复制到空工作表中。 在第一行) (包含列标题。
基于工作表创建数据库表
- 从第一个工作表中选择数据,包括列标题。
- 右键单击导航窗格,然后单击“ 粘贴”。
- 单击“ 是 ”以确认第一行包含列标题。
- 对剩余的每个工作表重复步骤 1-3。
查找最近或最不最近的日期
本部分中的步骤使用示例数据来说明创建前值查询的过程。
创建基本顶部值查询
在“创建”选项卡上的“查询”组中,单击“查询设计”。
双击“员工”表,然后单击“ 关闭”。
如果使用示例数据,请将 Employees 表添加到查询。将要在查询中使用的字段添加到设计网格。 可以双击每个字段,或将每个字段拖放到 “字段 ”行的空白单元格上。
如果使用示例表,请添加“名字”、“姓氏”和“出生日期”字段。在包含“出生日期”字段 (顶部或底部值的字段中,如果使用示例表) ,请单击“ 排序” 行并选择 “升序 ”或“ 降序”。
降序排序顺序返回最近的日期,升序排序顺序返回最早的日期。重要
必须仅在包含日期的字段的 “排序” 行中设置值。 如果为另一个字段指定排序顺序,查询不会返回所需的结果。
在“ 设计 ”选项卡的“ 工具 ”组中,单击“ 所有 ”旁边的向下箭头 (“ 热门值 ”列表) ,然后输入要查看的记录数,或从列表中选择一个选项。
单击“ 运行
以运行查询并在数据表视图中显示结果。将查询另存为 NextBirthDays。
可以看到,这种类型的顶级值查询可以回答基本问题,例如谁是公司中最老或最年轻的人。 后续步骤说明如何使用表达式和其他条件为查询增加功能和灵活性。 下一步中显示的条件返回接下来的三个员工生日。
向查询添加条件
这些步骤使用在前面的过程中创建的查询。 只要它包含实际的日期/时间数据,而不是文本值,就可以遵循不同的顶部值查询。
提示
若要更好地了解此查询的工作原理,请在每个步骤的“设计”视图和“数据表”视图之间切换。 如果要查看实际的查询代码,请切换到 SQL 视图。 若要在视图之间切换,请右键单击查询顶部的选项卡,然后单击所需的视图。
在导航窗格中,右键单击“NextBirthDays”查询,然后单击“ 设计视图”。
在查询设计网格中,在 BirthDate 右侧的列中输入以下内容:
MonthBorn: DatePart (“m”,[BirthDate]) 。
此表达式使用 DatePart 函数从 BirthDate 中提取月份。在查询设计网格的下一列中,输入以下内容:
DayOfMonthBorn: DatePart (“d”,[BirthDate])
此表达式使用 DatePart 函数从 BirthDate 中提取月份的日期。清除刚输入的两个表达式的“显示”行中的检查框。
单击每个表达式的 “排序” 行,然后选择“ 升序”。
在“出生日期”列的“条件”行中,键入以下表达式:
Month ([Birth Date]) > Month (Date () ) OR Month ([Birth Date]) = Month (Date () ) and day ([Birth Date]) >Day (Date () )
此表达式执行以下操作:月份 ([出生日期]) > Month (Date () ) 指定每个员工的出生日期落在未来的月份。
Month ([Birth Date]) = Month (Date () ) 和 Day ([Birth Date]) >Day (Date () ) 指定如果出生日期发生在当前月份,则生日位于当前日期或之后。
简言之,此表达式排除生日发生在 1 月 1 日至当前日期之间的任何记录。提示
有关查询条件表达式的更多示例,请参阅 查询条件示例一文。
在“设计”选项卡上的“查询设置”组中,在“返回”框中键入 3。
在“ 设计 ”选项卡上的“ 结果 ”组中,单击“ 运行
”。
注意
在使用自己的数据进行自己的查询中,有时可能会看到比指定更多的记录。 如果数据包含多个记录,这些记录共享一个位于前值中的值,则查询将返回所有此类记录,即使这意味着返回的记录数多于所需记录。
查找记录组的最近或最不最近的日期
使用总计查询查找属于组的记录的最早或最晚日期,例如按城市分组的事件。 总计查询是一种选择查询,它使用聚合函数 ((如 Group By、 Min、 Max、 Count、 First 和 Last) )来计算每个输出字段的值。
包括要用于类别的字段(分组依据)和包含要汇总的值的字段。 如果包括其他输出字段(例如,按事件类型分组时客户的名称),查询也将使用这些字段创建组,从而更改结果,以便他们不会回答原始问题。 若要使用其他字段标记行,请创建一个使用总计查询作为源的其他查询,并将其他字段添加到该查询。
提示
按步骤生成查询是一种非常有效的策略,用于回答更高级的问题。 如果在使复杂查询正常工作时遇到问题,请考虑是否可以将其分解为一系列更简单的查询。
创建总计查询
此过程使用 事件示例表 和 EventType 示例表 来回答此问题:
每种事件类型(不包括音乐会)的最新事件是什么时候?
在“创建”选项卡上的“查询”组中,单击“查询设计”。
双击“事件”和“EventType”表。
每个表都显示在查询设计器的顶部。双击 EventType 表的 EventType 字段和 Events 表中的 EventDate 字段,将字段添加到查询设计网格。
在查询设计网格的 EventType 字段的“条件”行中,输入 Concert<>。
提示
有关条件表达式的更多示例,请参阅 查询条件示例一文。
在“设计”选项卡上的“显示/隐藏”组中,单击“总计”。
在查询设计网格中,单击“EventDate”字段的 “总计 ”行,然后单击“ 最大值”。
在“设计”选项卡上的“结果”组中,单击“视图”,然后单击“SQL 视图”。
在 SQL 窗口中,在 SELECT 子句末尾的 AS 关键字 (keyword) 之后,将 MaxOfEventDate 替换为 MostRecent。
将查询另存为 MostRecentEventByType。
创建第二个查询以添加更多数据
此过程使用前面过程中的 MostRecentEventByType 查询来回答此问题:
每个事件类型的最近事件中谁是客户?
在“创建”选项卡上的“查询”组中,单击“查询设计”。
在“ 查询 ”选项卡上,双击“MostRecentEventByType”查询。
在“ 表 ”选项卡上,双击“事件”表和“客户”表。
在查询设计器中,双击以下字段:
- 在“事件”表中,双击“EventType”。
- 在 MostRecentEventByType 查询上,双击“MostRecent”。
- 在“客户”表中,双击“公司”。
在查询设计网格的 EventType 列的“排序”行中,选择“升序”。
在“设计”选项卡上的“结果”组中,单击“运行”。