标题:求助想在MDB数据库里做个汇总表
只看楼主
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:325
专家分:114
注 册:2010-2-17
结帖率:69.81%
已结贴  问题点数:20 回复次数:5 
求助想在MDB数据库里做个汇总表
现有一个MDB数据库(variation.mdb),内有4个表,前三个表的格式完全一样,第四个表想做一个汇总,并且需要有些计算。

具体操作如下:
1、    将表1(表名为variation)原封不动的复制到表4(表名为variation_4),即图中表1蓝色框里的内容全部复制到表4蓝色框里;
2、    将表2(表名为variation_2)里的每一条记录在和表4里每一条的前9栏进行比对,如果《管芯编号》、《测试组别》、《测试项目》、《管脚号》、《测试值下限》、《测试值上限》、《单位》完全一致的话,将表2里的《测试值》填写到表4对应条目的《测试值-2》位置, 并且计算《测试值》和《测试值-2》之间的差值(《测试值》-《测试值-2》),得出的差值填写到表4的《差值-2》栏中;
3、    (类似上一条),将表3(表名为variation_3)里的每一条记录在和表4里每一条的前9栏进行比对,如果《管芯编号》、《测试组别》、《测试项目》、《管脚号》、《测试值下限》、《测试值上限》、《单位》完全一致的话,将表3里的《测试值》填写到表4对应条目的《测试值-3》位置, 并且计算《测试值》和《测试值-3》之间的差值(《测试值》-《测试值-3》),得出的差值填写到表4的《差值-3》栏中;
4、    如果表2为空、表3不为空的话,仅进行第1、3步;如果表2不为空、表3为空的话,仅进行第1、2步;
5、    如果表2或表3的每一条在进行与表4的每一条的前9栏进行比对,没有匹配的话,则进行下一条的比对,不需要做出提示。

敬请路过的大神和版主告知这段语句如何撰写,在这里先行拜谢。

另外,曾经出现过表1、表2、表3各有400万条以上的数据的极限情况,那个时候variation.mdb文件已经达到1.3G左右,麻烦在编写这段程序时要考虑比对效率问题。

多谢多谢。

variation.rar (71.41 KB)
搜索更多相关主题的帖子: 比对 测试 差值 数据库 MDB 
2021-04-22 00:35
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:10 
SELECT 查询1.*, variation_3.测试值 as 测试值3 ,(查询1.测试值 - variation_3.测试值) as    差值3
FROM (SELECT variation.*, variation_2.测试值 AS 测试值2,(variation_2.测试值-variation.测试值) as 差值2
FROM variation LEFT JOIN variation_2 ON (variation.管芯编号 = variation_2.管芯编号) AND (variation.测试组别 = variation_2.测试组别) AND (variation.测试项目 = variation_2.测试项目) AND (variation.管脚号 = variation_2.管脚号) AND (variation.单位 = variation_2.单位))  as 查询1 LEFT JOIN  variation_3 on (查询1.管芯编号 = variation_3.管芯编号) AND (查询1.测试组别 = variation_3.测试组别) AND (查询1.测试项目 = variation_3.测试项目) AND (查询1.管脚号 = variation_3.管脚号) AND (查询1.单位 = variation_3.单位);

----------------粗解释------------------
SELECT         
查询1.*             显示查询1的所有字段
 variation_3.测试值 as 测试值3 ,(查询1.测试值 - variation_3.测试值) as 差值3      3表指定字段的运算字段,给别名
FROM  指定表
(SELECT variation.*, variation_2.测试值 AS 测试值2,(variation_2.测试值-variation.测试值) as 差值2 FROM variation LEFT JOIN variation_2 ON (variation.管芯编号 = variation_2.管芯编号) AND (variation.测试组别 = variation_2.测试组别) AND (variation.测试项目 = variation_2.测试项目) AND (variation.管脚号 = variation_2.管脚号) AND (variation.单位 = variation_2.单位))  as 查询1   生成查询1 临时表,使用的左连接查询 这里也是一个查询 命令。
LEFT JOIN  variation_3 on (查询1.管芯编号 = variation_3.管芯编号) AND (查询1.测试组别 = variation_3.测试组别) AND (查询1.测试项目 = variation_3.测试项目) AND (查询1.管脚号 = variation_3.管脚号) AND (查询1.单位 = variation_3.单位);  查询表1与3表左连接查询的限制条件。

--------------------
认为太短的话,还可以不用星号
这是SQL命令,直接生成一个临时的表4,不保存数据。如果程序里使用,可以直接查询生成一个 表,然后对表进行访问。
命令在 ACCESS 2019 中测试通过。


授人于鱼,不如授人于渔
早已停用QQ了
2021-04-22 20:29
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:325
专家分:114
注 册:2010-2-17
得分:0 
尊敬的 风吹过b 大大:
    经过几天的对您给出的语句的进行分析以及对网上数据库语句的学习,恕我驽钝,对数据库的深入操作的学习,还是走进了死胡同,两眼一抹黑,实在是不能把您给出的提示融入到我的程序中,现将我的程序奉上,麻烦您给出一段可执行的完整语句,添加到我的程序中,跪谢中。
    另外,关于我的前一个帖子《如何对1.7G左右的TXT文件进行快速读写处理?》还是按照您提议的方法:将文件进行按段进行切割,分别保存为一个一个的文件,放一个临时目录,然后经处理后读入数据库(本程序中的数据库就是按照这个方法生成的),文本文件大了,慢是比较慢,但是能够处理1.7G以上的TXT文件,不会死机。但是又出现了新问题,读入这个较大的文本文件到数据库中后,行数达到的500万行以上,已经远远超出“Excel2007及以后的版本最大行数是1048576行”的限制,我的程序中“导出到EXCEL文件”功能按钮就无法正常使用了,这个问题怎么解决呢?也想请您给出一个解决方法。
    在这里先非常感谢您的无私帮助。
数据库表.rar (76.61 KB)
2021-04-24 18:52
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
dim sql as string
sql="SELECT 查询1.*, variation_3.测试值 as 测试值3 ,(查询1.测试值 - variation_3.测试值) as 差值3
FROM (SELECT variation.*, variation_2.测试值 AS 测试值2,(variation_2.测试值-variation.测试值) as 差值2
FROM variation LEFT JOIN variation_2 ON (variation.管芯编号 = variation_2.管芯编号) AND (variation.测试组别 = variation_2.测试组别) AND (variation.测试项目 = variation_2.测试项目) AND (variation.管脚号 = variation_2.管脚号) AND (variation.单位 = variation_2.单位))  as 查询1 LEFT JOIN  variation_3 on (查询1.管芯编号 = variation_3.管芯编号) AND (查询1.测试组别 = variation_3.测试组别) AND (查询1.测试项目 = variation_3.测试项目) AND (查询1.管脚号 = variation_3.管脚号) AND (查询1.单位 = variation_3.单位);"

dim  rs as new Recordset
rs.open sql,cnn,3,1
.............
大概就是这样的,字段的顺序,你到 access 去查询,或者自己用代码列出来也可以的。需要指定顺序,那就在把第一个星号,改成字段名的顺序
如 查询1.文件名,查询1.管芯编号 。。。。。

-----------
浏览器写的代码



授人于鱼,不如授人于渔
早已停用QQ了
2021-04-24 21:28
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
超过了excel的行数据,照样切割成多个文件就是了。

授人于鱼,不如授人于渔
早已停用QQ了
2021-04-24 21:29
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:10 
添加两个按钮,代码如下,供参考,另外你的数据库variation_4表中的字段名包含-号,需要修改,改为符合变量名要求的名字或者使用'符号包围起来
程序代码:
Private Sub to4_Click()
Dim str As String
Dim s As String
Dim ses As String
Dim ses1 As String
Dim Con As New ADODB.Connection


If Not Con.State Then

Con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\variation.mdb;Persist Security Info=False"
Con.Open

End If

s = " a1.*   ,a2.测试值 as '测试值-2' ,(a1.测试值-a2.测试值) as '差值-2' ,a3.测试值 as '测试值-3' ,(a1.测试值-a3.测试值) as '差值-3' "


ses = "(a1.管芯编号=a2.管芯编号) and (a1.测试组别=a2.测试组别) and (a1.测试项目=a2.测试项目) and (a1.管脚号=a2.管脚号) and (a1.测试值下限=a2.测试值下限) and (a1.测试值上限=a2.测试值上限) and (a1.单位=a2.单位)"

ses1 = "(a1.管芯编号=a3.管芯编号) and (a1.测试组别=a3.测试组别) and (a1.测试项目=a3.测试项目) and (a1.管脚号=a3.管脚号)and (a1.测试值下限=a3.测试值下限) and (a1.测试值上限=a3.测试值上限) and (a1.单位=a3.单位)"


str = "INSERT INTO variation_4 SELECT   " & s & "  FROM (variation as a1 LEFT JOIN  variation_2 as a2 ON " & ses & ") LEFT JOIN  variation_3 as a3 ON " & ses1

Con.Execute "DELETE * FROM variation_4"
Con.Execute str

Con.Close

Set Con = Nothing
Adodc4.Refresh
End Sub

Private Sub Command1_Click()
Dim Con As New ADODB.Connection


If Not Con.State Then

Con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\variation.mdb;Persist Security Info=False"
Con.Open

End If

Con.Execute "DELETE * FROM variation_4"


Con.Close

Set Con = Nothing

Adodc4.Refresh
End Sub
2021-04-25 09:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-505533-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.056182 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved