4.4.2 自定义计算

4.4.2 自定义计算

查询可以对数据源字段进行预定义计算,但预定义只能计算固定项目的汇总计算,如求和,最大值等,如果计算复杂,则只能自定义计算,自定义计算查询功能更强大,应用更广。

自定义计算字段的标题及计算表达式在查询设计视图的自定义字段文本框中输入,格式为:

自定义字段标题:计算表达式

计算表达式中一般包括对数据源字段的引用,自定义字段别字及表达式计算结果保存在查询中,通过查询数据视图显示。

自定义字段标题只有作显示用,不能引用。

任务4.8 创建名为“学生年龄查询”,要求显示“10网络工程1班”学生“姓名”、“性别”和“年龄”,并按“年龄”升序排序(年龄=当前年-出生年)。

操作步骤:

(1)打开“教学信息管理”数据库,单击“创建”选项卡→“查询”组→“查询设计”,打开“查询1”的设计视图,添加“班级表”、“学生表”,并自动建立关系。

(2)添加字段“学号”、“姓名”和“性别”。在字段行第4列“字段”单元格中输入“年龄:Year(Date())-Year([出生日期])”(表达式以冒号分为两部分,冒号前为查询字段标题,后者为查询字段的计算表达式),并定义计算字段为“升序”,如图4-33所示。

图4-33 设计计算字段

(3)单击“查询工具/设计”上下文选项卡→“结果”组→“运行”,显示查询数据表视图,如图4-34所示。

(4)单击“快速访问工具栏”→“保存”按钮,弹出“另存为”对话框,输入查询名为“学生年龄查询”,单击“确定”按钮。

任务4.9 创建名为“学生成绩等级查询”,要求显示“10市场营销1班”学生的“学号”、“姓名”、“平均分”和“等级“。等级评定为:平均分大于等于80为“优”,大于等于60,小于80为“中”,其余为“差”;平均分取整。

分析:

由于“等级”与“平均分”都属于计算字段,且“等级”来源于“平均分”,而“平均分”又来源于“成绩”,在“等级”表达式中,不能通过“平均分”标题引用,在此情形下,可以先创建一个“学生平均分查询”,再以该查询作为数据源,计算平均分计算等级。

操作步骤:

(1)创建“学生平均分查询”,设计界面如图4-35所示。

图4-34 查询结果

图4-35 平均分查询设计窗口

(2)计算等级并设为格式。添加“学生平均分查询”,在字段行的第4列单元格中输入:

“等级:IIf([平均分]>=80,"优",IIf([平均分]>=60,"中","差"))(可以在等级表达式中引用查询字段“平均分”,而不能引用自身查询的计算字段,这就是建立“学生平均分查询”过渡查询的原因)。

单击“查询工具/设计”上下文选项卡→“显示/隐藏”组→“属性表”,弹出“属性表”对话框,在“常规”选项卡的“格式”组合框中选择“固定”,“小数位数”组合框中选择“0”,设计效果,如图4-36所示。

说明:函数IIF用于条件判断求值,格式为:

IIF(条件,值1,值2)

图4-36 设置查询字段

判断规则:如果条件成立,函数结果为值1,否则为值2。

(3)单击“查询工具/设计”上下文选项卡→“结果”组→“运行”,查询结果以数据表视图显示,如图4-37所示。

(4)单击“快速访问工具栏”→“保存”按钮,弹出“另存为”对话框,输入查询名称为“学生等级查询”,单击“确定”按钮。

问题及解决方案:仔细观察图4-37,第5条记录,平均分显示为80,而等级为“中”,为什么?

这是因为平均分格式设置有固定格式,按4舍5入显示0位小数,而真实数据没有变化,如果删除“属性表”中“平均分”的格式设置,还原真实数据,结果如图4-38所示。

图4-37 查询结果

图4-38 显示单元真实数据

格式化只改变数字的显示,不改变数据真实值,等级计算以真实值计算,造成平均分显示值与等级不一致。

如果要使显示数据就是数据本身,必须采用Round()函数。Round()函数的运算规则是采用4舍5入精确到指定的小数位数。

修改“平均分查询”,重新设计平均分计算字段,计算表达式修改为:

平均分:Round(Avg([成绩]),0) “0”表示取小数位数,0位小数即取整

如图4-39所示。

图4-39 重新设计平均分计算字段

重新运行“学生成绩等级查询”。运行结果如图4-40所示,观察数据与等级完全一致。

图4-40 调整后显示数据与真实数据一致