4.3 实用选择查询设计
选择查询是 Access支持的多种类型查询对象
中最重要的一种,它不仅仅可以完成数据的
筛选、排序等操作,更常见的用途还在于它
的计算功能、汇总统计功能以及接受外部参
数的功能。同时,选择查询还是其他类型查
询创建的基础。在后续各节中我们会看到,
为了创建其他类型的查询,常常会先建立一
个选择查询,然后再逐步进行设计修改,以
达到实现相关类型查询的设计结果。
4.3 实用选择查询设计
4.3.1、计算查询列设计
4.3.2、汇总查询设计
4.3.3、参数查询对象设计
“零售商店管理信息系统”
中的 汇总查询设计
通过查询操作完成基表内部或各基表之间数
据的计算,是建立查询对象的一个常用的功
能。完成计算操作是通过在查询对象中设计
计算查询列实现的,当查询运行时,计算查
询列就如同一个字段一样。计算查询列本质
上是一个计算表达式,设置计算查询列的操
作可以借助于向导在, 表达式生成器, 对话
框中完成。令光标停留在需要设置计算查询
列的, 字段, 行上,单击查询设计视图工具
栏上的, 向导, 工具按钮,”,即弹出, 表
达式生成器, 对话框,如图 4-10所示。与设
定查询准则的逻辑表达式不同,计算查询列
上是一个计算表达式。
4.3.1 计算查询列设计
图 4-8中所示的, 销售利润, 列就是一个计
算查询列, 在这一列的, 字段, 行中填入的内容
为:
销售利润, [销售单价 ]*[销售数量 ]-[进货单
价 ]*[销售数量 ]
这个计算表达式分为用冒号隔开的两个部
分。冒号右边是一个 VBA算术表达式,它的含
义是用本查询中的“销售单价”与“销售数量”
两个字段的数据之积,减去本查询中的“进货单
价”与“销售数量”两个字段的数据之积。字段
名均用方括号括起来,这属于 VBA的语法规则,
必须遵循。由于所用字段都是本查询中的字段,
因此不用指明其父类,否则,需写成,[表名 ]!
[字段名 ]。所用到的算术运算符与其他程序设计
语言使用的算术运算符相同。
冒号左边将等同于字段名,本例中设定为
,销售利润, 。如果使用向导,在, 表达式生成
器, 对话框中完成计算表达式的设计,Access将
用, 表达式 1” 作为第一个计算查询列的字段名,
并依次为后续的计算查询列命名字段。
一般情况下,人们都不会满意将字段名命
名为, 表达式 1” 这样的形式。这就需要自己来
重新给字段命名。为此,可以在, 表达式生成器,
对话框中完成计算表达式的设计后,单击确定按
钮退回查询设计视图后,再将, 表达式生成器,
自行确定的, 表达式 1” 修改为, 销售利润, 。
其操作方法是,鼠标单击字段行中的, 表达式
1”,再删除该字段行中位于计算表达式冒号左
侧的字符,并输入所希望的字符串。
还可以设计计算查询列中数据的显示格式。
其操作方法是,在需要重新设置显示格式的计算
查询列, 字段, 行处右击鼠标,在随之弹出的快
捷菜单上单击【属性】;或令光标停留在需要设
置显示格式的计算查询列, 字段, 行上,在查询
设计视图的菜单栏上单击【视图】 |【属性】
(或单击查询设计视图工具栏上, 属性, 工具按
钮,” )。即弹出, 字段属性, 对话框,如图 4-
12所示。
在, 字段属性, 对话框中,即可为所选字
段设置包括显示格式在内的各项字段属性。图 4-
12所示,是将, 销售数据记录查询, 的, 销售利
润, 计算查询列的显示格式设置为货币格式的参
数设置操作示例。
设计汇总查询也是在查询设计视图中
进行。在查询设计视图打开一个已经建
立的选择查询对象,在工具栏上单击
,汇总, 按钮,” 。这时,在查询设计
视图下部的参数设置区中将增加一个名
为, 总计, 的行,其间参数均为, Group
By”。,总计, 行中的参数标明各字段是
属于分类字段( Group By) 还是汇总字
段( Expression),一个汇总查询至少应
有一个分类字段和一个汇总字段。
4.3.2 汇总查询设计
以, 销售业绩查询, 为例,如果希望得到
以, 货名,,, 规格,,, 进货单价, 和, 销
售单价, 三个字段作为分类字段的, 销售数量,
和, 销售利润, 两个字段的汇总数据,则应将
,货名,,, 规格,,, 进货单价, 和, 销售
单价, 四个字段均设置为分类字段,而将, 销
售数量, 和, 销售利润, 两个字段都设置为汇
总数据。图 4-13所示即为相关设计参数。三个
分类字段可以采用 4.1.1讲述的设定字段名的方
法设定,且, 总计, 行参数不用修改。两个汇
总字段可采用 4.3.1节讲述的设定计算字段的方
法设定,且, 总计, 行参数会自动根据所设立
的计算表达式而改为, Sum”或, Expression”。
图 4-13,销售利润明细查询”的总计属性设计
图 4-13所示查询对象所对应的 SQL语句为:
SELECT 库存数据记录,货名,库存数据记录,规格,
库存数据记录,进货单价,
销售数据记录,销售单价,
Sum([销售数据记录 ]![销售数量 ]) AS 销售数量,
[销售单价 ]*[销售数量 ]-[进货单价 ]*[销售数量 ]
AS 销售利润
FROM 库存数据记录 INNER JOIN 销售数据记录
ON 库存数据记录,货号 = 销售数据记录,货号
GROUP BY 库存数据记录,货名,库存数据记录,规
格,库存数据记录,进货单价,销售数据记录,销售
单价 ;
此处所指的参数特指查询准则中使用的变量,
参数查询对象则是指本查询对象所使用的参数
需由数据库中其他对象赋值方能运行的查询 。
以 4.3.2节提到的需求为例。一般会希望针
对某一个时间段内的销售数据进行汇总统计,
而这个时间段又应该由数据库应用系统的使用
者在他的操作中输入。假定输入这个时间段的
操作是在一个称为, 销售业绩查询汇总, 的窗
体中进行,则相应的, 销售业绩查询, 参数设
置如图 4-14所示。其中准则表达式为:
Between [Forms]![销售业绩查询汇总 ]![Text29]
And [Forms]![销售业绩查询汇总 ]![Text67]))
4.3.3 参数查询设计
其含义是:销售日期起于
,销售业绩查询汇总, 窗体中
,Text29”文本框中输入的起始
日期,而终于, 销售业绩查询
汇总, 窗体中, Text67”文本框
中输入的终止日期。它导致的
运行结果就是筛选出在这个日
期段内的销售数据记录。
图 4-14,销售利润明细查询”的条件属性设

图 4-14所示查询对象所对应的 SQL语句为:
SELECT 销售数据记录,销售日期,库存数据记
录,货号,库存数据记录,货名,库存数据记录,
规格,
库存数据记录,计量单位,库存数据记录,进货单
价,库存数据记录,库存数量,
销售数据记录,销售单价,Sum(销售数据记录,销
售数量 ) AS 销售数量,
Sum([销售数据记录 ]![销售单价 ]*[销售数据记
录 ]![销售数量 ]) AS 销售金额,
[销售单价 ]*[销售数量 ]-[进货单价 ]*[销售数量 ]
AS 销售利润,销售数据记录,销售人员
FROM 库存数据记录 INNER JOIN 销售数据记录
ON 库存数据记录,货号 = 销售数据记录,货号
GROUP BY 销售数据记录,销售日期,库存数据记
录,货号,库存数据记录,货名,
库存数据记录,规格,库存数据记录,计量单位,库
存数据记录,进货单价,
库存数据记录,库存数量,销售数据记录,销售单价,
销售数据记录,销售人员
HAVING (((销售数据记录,销售日期 ) Between
[Forms]![销售业绩查询汇总 ]![Text29]
And [Forms]![销售业绩查询汇总 ]![Text67]))
ORDER BY 销售数据记录,销售日期 ;
? 1.“销售结转清查询”
设计
?“零售商店管理信息系统”
数据库中的“销售结转清查
询”对象设计如图 4-15所示。
4.3.4,“零售商店管理信息系统”中的汇
总查询设计
图 4-15,销售结转清查询”的各项属性设计
图 4-15所示查询对象所对应的 SQL语句为:
SELECT 柜存数据记录,货号,柜存数据记录,货
名,柜存数据记录,规格,柜存数据记录,计量单
位,
柜存数据记录,柜存数量,柜存数据记录,销售单
价,
Sum(销售数据记录,销售数量 ) AS 销售数量,
Sum([销售数据记录 ]![销售单价 ]*[销售数据记
录 ]![销售数量 ])
AS 销售金额,销售数据记录,销售日期,销售数
据记录,销售人员
FROM 柜存数据记录 INNER JOIN 销售数据记录
ON 柜存数据记录,货号 = 销售数据记录,货号
GROUP BY 柜存数据记录,货号,柜存数据记录,
货名,柜存数据记录,规格,
柜存数据记录,计量单位,柜存数据记录,柜存数
量,柜存数据记录,销售单价,
销售数据记录,销售日期,销售数据记录,销售人

HAVING ((( 销 售 数 据 记 录, 销 售 日
期 )=[Forms]![交接班结转清 ]![Text29])
AND ((销售数据记录,销售人员 )=[Forms]![交接
班结转清 ]![Combo45]))
ORDER BY 柜存数据记录,货号 ;
2.“销售业绩查询”设计
?“零售商店管理信息系统”数据库中的
“销售业绩查询”对象设计如图 4-16所
示。
图 4-16,销售业绩查询”的各项属性设计
? 图 4-16所示“销售业绩查询”对象所对应的
SQL语句为:
SELECT 销售数据记录,销售日期,库存数据记录,
货号,库存数据记录,货名,库存数据记录,规格,
库存数据记录,计量单位,库存数据记录,进货单价,
库存数据记录,库存数量,
销售数据记录,销售单价,Sum(销售数据记录,销
售数量 ) AS 销售数量,
Sum([销售数据记录 ]![销售单价 ]*[销售数据记
录 ]![销售数量 ]) AS 销售金额,
[销售单价 ]*[销售数量 ]-[进货单价 ]*[销售数量 ]
AS 销售利润,销售数据记录,销售人员
FROM 库存数据记录 INNER JOIN 销售数据记录
ON 库存数据记录,货号 = 销售数据记录,货号
GROUP BY 销售数据记录,销售日期,库存数据记
录,货号,库存数据记录,货名,库存数据记录,规
格,
库存数据记录,计量单位,库存数据记录,进货单价,
库存数据记录,库存数量,
销售数据记录,销售单价,销售数据记录,销售人员
HAVING (((销售数据记录,销售日期 ) Between
[Forms]![销售业绩查询汇总 ]![Text29]
And [Forms]![销售业绩查询汇总 ]![Text67]))
ORDER BY 销售数据记录,销售日期 ;