注册 登录
编程论坛 ACCESS论坛

SELECT TOP N *用法求助

megnhai19813 发布于 2021-12-11 22:54, 1536 次点击
有表T1,用于记录每个项目的报价记录,基本字段A存放项目信息,字段B存放价格,另有字段C记录价格是否有效(是否型,默认值1/“有效”),设窗体、文本框,指定为[Forms].[数据计算].[Text1]。

C字段的计算规则:
每个项目按价格排序,最高价格的20%记录应被去除,方法将其对应的C字段置为为价格部分置为无效0/“否”,同时小数第1位四舍五入至整数位,即ROUND(该项目记录总数*0.2)。

重要事项:
这个TOP后面的N不是固定值,每个项目都不一样,即上面说的ROUND(该项目记录总数*0.2)

目的:根据排序,筛选出上限为ROUND()计算值的所有记录并作UPDATE。

方法1:在CLICK事件过程中
因为可以用DCount()函数取得项目记录数,并且可以设定变量赋值,偿试用select top n *,语法后DoCmd.Runsql ,发现这里不支持该语法。

方法2:使用更新查询(设窗体的文本框已输入指定数据)
单独语句:SELECT COUNT(*) FROM T1 WHERE A=Forms.数据计算.Text1;                                ‘可以执行,并得到记录总数
单独语句:SELECT  TOP 2 * FROM T1 WHERE A=Forms].[数据计算].[Text1] ORDER BY B DESC;            ‘语法可以执行,此处的2只是为了试验语法是否可行

1、偿试用DCount函数替换这个N,不考虑ROUND运算:
SELECT  TOP DCount("*","T1",'"&[Forms].[数据计算].[Text1]&"') * FROM T1 WHERE A=Forms].[数据计算].[Text1] ORDER BY B DESC;   ‘无法执行,提示:SELECT 子句中包含一个保留字、拼写错误或丢失的参数,或标点符不正确。
2、偿试SELECT 嵌套,不考虑ROUND运算
SELECT  TOP (SELECT COUNT(*) FROM T1 WHERE A=Forms.数据计算.Text1) * FROM T1 WHERE A=Forms].[数据计算].[Text1] ORDER BY B DESC;  ‘同样无法执行,报同样的错
3、偿试在窗体用DCOUNT取得记录总数并存变量INT2,不考虑ROUND运算
一、CLICK代码有:
int2 = DCount("*", "REC", "PRONAM = '" & STR1 & "' ")     '输入框已赋值给变量TTR1
MsgBox int2                                               '取得记录数并输出,已取到正确值。
DoCmd.OpenQuery "XXX"                                     '存放SQL语句的查询名称为XXX
二、XXX查询代码
SELECT  TOP [Forms].[数据计算].int2  * FROM T1 WHERE A=Forms].[数据计算].[Text1] ORDER BY B DESC;            '无法执行/保存,报同样的错

跪求解法?


2 回复
#2
megnhai198132021-12-11 23:05
N必须 是常量?那这个问题怎么解
#3
厨师王德榜2021-12-13 14:44
先Select  项目信息 , count(*)  as 条数 from ... group by 项目信息 得到每个项目有多少条,
查询结果保存在一个RecordSet中.
再遍历这个RecordSet ,根据 条数和 项目信息 ,拼凑出不同的 Update 语句
再执行这个拼凑出的 Update 语句 .

可以直接在Access中写 VBA,当然用其它编程语言也是可以的,不复杂.
1