VB关于SQL select from where读取ACCESS的问题
ACCESS有一个名称为"数据表"的数据库,数据表只有两列数据,一列是密度,一列是强度。
VB已经与ACCESS成功连接。
想实现找到数据表中密度增长10%时,强度增长最接近50%的对应强度的密度。text1.text最终得到这个密度。
我是新手,暂时写了如下代码,但是有问题,麻烦高手们帮忙修改下,具体需要怎么写,万分感谢!
Set Scnny = New ADODB.Connection
Scnny.CursorLocation = adUseClient
Scnny.Open "Provider=Microsoft.jet.oledb.4.0;Data source=" & App.Path & "\Data\Data.mdb;Persist Security Info=False;Jet OLEDB:Database Password=123456"
Set srt1y = New ADODB.Recordset
Set srt1y.ActiveConnection = Scnny
srt1y.Open "select * from 数据表 where abs((select 强度H from 数据表 where 密度 * 1.1) / (select 强度H from 数据表 where 密度 * 1)-1.5) in (select min((select 强度H from 数据表 where 密度 * 1.1) / (select 强度H from 数据表 where 密度 * 1)-1.5) from 数据表) "
If Not srt1y.EOF Then
Text1.Text = srt1y!密度
End If
srt1y.Close
补充说明:
我怕语言描述大神们不好理解,特意用EXCEL做了个计算实例,如下图所示。不过这个只是用EXCEL计算的例子,最终是想把EXCEL这个效果在VB中用SQL语句连接ACCESS实现。
当密度增长10%时,强度增长50%,得到了最终想要的结果密度是15980。
思路是:15980对应的强度是0.3207,15980增加10%是17578,17578最接近的是17580,17580对应的强度是0.4790,0.4790除以0.3207=1.49356,最接近1.5倍,相当于0.3207到0.4790增长最接近50%,所以得到了最终的磁密是15980。
VB已经与ACCESS成功连接。
想实现找到数据表中密度增长10%时,强度增长最接近50%的对应强度的密度。text1.text最终得到这个密度。
我是新手,暂时写了如下代码,但是有问题,麻烦高手们帮忙修改下,具体需要怎么写,万分感谢!
Set Scnny = New ADODB.Connection
Scnny.CursorLocation = adUseClient
Scnny.Open "Provider=Microsoft.jet.oledb.4.0;Data source=" & App.Path & "\Data\Data.mdb;Persist Security Info=False;Jet OLEDB:Database Password=123456"
Set srt1y = New ADODB.Recordset
Set srt1y.ActiveConnection = Scnny
srt1y.Open "select * from 数据表 where abs((select 强度H from 数据表 where 密度 * 1.1) / (select 强度H from 数据表 where 密度 * 1)-1.5) in (select min((select 强度H from 数据表 where 密度 * 1.1) / (select 强度H from 数据表 where 密度 * 1)-1.5) from 数据表) "
If Not srt1y.EOF Then
Text1.Text = srt1y!密度
End If
srt1y.Close
补充说明:
我怕语言描述大神们不好理解,特意用EXCEL做了个计算实例,如下图所示。不过这个只是用EXCEL计算的例子,最终是想把EXCEL这个效果在VB中用SQL语句连接ACCESS实现。
当密度增长10%时,强度增长50%,得到了最终想要的结果密度是15980。
思路是:15980对应的强度是0.3207,15980增加10%是17578,17578最接近的是17580,17580对应的强度是0.4790,0.4790除以0.3207=1.49356,最接近1.5倍,相当于0.3207到0.4790增长最接近50%,所以得到了最终的磁密是15980。
...全文
请发表友善的回复…
发表回复
of123 2018-05-29
- 打赏
- 举报
Private Sub Command1_Click()
Dim cn As ADODB.Connection
Dim rs1 As ADODB.Recordset, rs2 As ADODB.Recordset
Dim lngDensity As Long, dblStrength As Double
Set cn = New ADODB.Connection
Set rs1 = New ADODB.Recordset
Set rs2 = New ADODB.Recordset
cn.Open "Provider=Microsoft.jet.oledb.4.0;Data source=c:\test\test.mdb;"
rs1.Open "SELECT * FROM data_table", cn
Do Until rs1.EOF
lngDensity = ((rs1!density * 1.1 + 5) \ 10) * 10
dblStrength = rs1!strength * 1.5
rs2.Open "SELECT density FROM data_table WHERE density = " & lngDensity & " AND strength >= " & dblStrength & " ORDER BY density", cn
If Not rs2.EOF Then
rs2.Close
Exit Do
Else
rs2.Close
End If
rs1.MoveNext
Loop
MsgBox rs1!density
rs1.Close
End Sub
的确,得到的查询结果是 15990。如果将 1.5 改为 1.49 则得到 15980。脆皮大雪糕 2018-05-28
- 打赏
- 举报
那个SQL语句彻底错的吧
of123 2018-05-28
- 打赏
- 举报
1 你写入 密度*1.1 列的数据要事先在 10 位就近取整,以便查询均以 10 位取整的密度列。
2 你可能要进行两层查询(也许其他网友还有嵌套查询的方案)
rs1.Open "SELECT * FROM [数据表]"
Do Until EOF(rs1)
rs2.Open "SELECT TOP 1 [密度] WHERE [密度] = " & rs1![密度*1.1] & " AND [强度] >= " & rs1![1.1倍密度对应的强度] & " ORDER BY [密度]"
If Not rs2.EOF Then Exit Do
rs1.MoveNext
Loop
rs2.Close
MsgBox rs1!密度
rs1.Close
数据表名、列名最好不用汉字和标点符号,特别是可解释为运算符的标点符号。脆皮大雪糕 2018-05-28
- 打赏
- 举报
好吧,这是我觉得比较恶心的一个SQL语句了,为了在一句内搞定不用临时表啥的,于是用了三层的子表嵌套。查询出来第一行应该就是你要的。从实际查询结果看也是15990那条记录最匹配,15980那条排名第二。
当然,我的比较差异的方式是取绝对值的,不知道是否符合你的要求
当然,我的比较差异的方式是取绝对值的,不知道是否符合你的要求
SELECT l33.密度, l33.匹配密度, l31.强度, l32.强度 AS 匹配强度, Abs(l31.强度*1.5-l32.强度) AS 强度差异
FROM 数据表 AS l31, 数据表 AS l32, (SELECT l21.密度, l21.匹配密度, l22.最小差异 FROM (SELECT l11.密度, l12.密度 AS 匹配密度, abs(l11.密度 * 1.1 - l12.密度) AS 差异 FROM 数据表 AS l11, 数据表 AS l12) AS l21, (SELECT l11.密度, min(abs(l11.密度 * 1.1 - l12.密度)) AS 最小差异 FROM 数据表 AS l11, 数据表 AS l12 GROUP BY l11.密度) AS l22 WHERE l21.差异 = l22.最小差异) AS l33
WHERE (((l31.密度)=l33.密度) And ((l32.密度)=l33.匹配密度))
ORDER BY Abs(l31.强度*1.5-l32.强度);
脆皮大雪糕 2018-05-28
- 打赏
- 举报
你的推演结果是错的,你看密度15990那条的强度比15980那个更接近1.5倍
舉杯邀明月 2018-05-27
- 打赏
- 举报
我感觉你在数据库中增加1列,就是“密度增长10%时,强度增长了多少”,
然后查询这1列数据中,哪项最接近“目标值”还相对靠谱点儿。
舉杯邀明月 2018-05-27
- 打赏
- 举报
感觉你是想在“SQL查询操作”的同时,还要实现“迭代运算”啊(并且是“有条件的迭代”、还是“模糊条件”),
它能支持你进行这样的“操作”吗…………
反正SQL操作我是外行,观望一下。