注册 登录
编程论坛 SQL Server论坛

数据导入,选取最近一笔时间数据

cmo9020 发布于 2020-07-08 00:02, 3186 次点击
请问有大牛哥牛姐在吗?
小弟遇到一个sql查询问题
主档tt要导入shipp+scra数据
主档在G列输入条形码后,按鈕导入shipp+scra数据 I列代码中的内容,如果G列条形码重复的话,依照N列提取最近一笔时间为2020/7/7日,
可是一直都导入6/30那笔数据....(反橘色)
请问是那裡有问题?请大神们帮个忙修正一下数据,谢谢

只有本站会员才能查看附件,请 登录


Sub xx()
Dim Cn As Object, ar, i&, p$, f$, Sq$(2), s$
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Set Cn = CreateObject("ADODB.Connection")
If Application.Version < 12 Then
  s = "Excel 8.0;Database="
  Cn.Open "Provider=Microsoft.JET.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName
Else
  Cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
  s = "Excel 12.0;Database="
End If
With Worksheets(1)
  .Activate
  Sq(0) = "[" & .Name & "$g1:g" & .Cells(.Rows.Count, "g").End(xlUp).Row & "]a"
End With
p = ThisWorkbook.Path & "\"
ar = Array("scra.xls", "SHIPP.xls")
For i = 0 To UBound(ar)
  f = p & ar(i)
  If Dir(f, vbDirectory) <> "" Then
   Sq(1) = Sq(1) & " UNION ALL SELECT 條碼,代碼,狀態,時間 FROM [" & s & f & "].[$A1:N] WHERE 條碼 IS NOT NULL"
  End If
Next
Sq(1) = "SELECT * FROM (" & Mid(Sq(1), 12) & ") ORDER BY 時間"
Sq(1) = "SELECT 條碼,LAST(代碼) AS 代碼,LAST(狀態) AS 狀態,MAX(時間) AS 時間 FROM (" & Sq(1) & ") GROUP BY 條碼"
Sq(2) = "SELECT b.代碼 FROM " & Sq(0) & " LEFT JOIN (" & Sq(1) & ")b ON a.條碼=b.條碼"
Range("i2").CopyFromRecordset Cn.Execute(Sq(2))
Cn.Close
Set Cn = Nothing
Application.DisplayStatusBar = True
Application.ScreenUpdating = True
End Sub


[此贴子已经被作者于2020-7-8 00:05编辑过]

6 回复
#2
厨师王德榜2020-07-09 18:23
平时工作忙,没时间给你检查那么细,只能把正确的示意出来,代码改了一半,剩下的靠你自己了。
只有本站会员才能查看附件,请 登录
#3
厨师王德榜2020-07-09 18:26
总之你的查询语句不对,你可以参照我的来改。
只有本站会员才能查看附件,请 登录
#4
cmo90202020-07-09 19:09
回复 3楼 厨师王德榜
好~先谢谢大哥了,我在研究一下~谢谢
#5
cmo90202020-07-09 19:58
回复 3楼 厨师王德榜
大神~我测试成功,谢谢你
不过想请教...这段程序能精简吗?
要是我要导入5个~多档,可能会很麻烦

Dim Cn As Object, ar, i&, p$, f$, Sq$(2), s$, qstr$   'qstr -- 淏腔脤戙逄曆
qstr = "select ee.代碼 from  [Sheet1$g1:g1000]  as aa left join ( select  bb.條碼,bb.代碼,cc.sj as 時間 from  " & _
"(SELECT 條碼,代碼,狀態,時間 FROM [Excel 12.0;Database=C:\Users\X\Desktop\TEST\scra.xls].[$A1:N] " & _
"            WHERE 條碼 IS NOT NULL UNION ALL " & _
"            SELECT 條碼,代碼,狀態,時間 FROM [Excel 12.0;Database=C:\Users\X\Desktop\TEST\SHIPP.xls].[$A1:N]  " & _
"            WHERE 條碼 IS NOT NULL) as bb inner join  (SELECT 條碼, max(時間) as sj FROM  ( " & _
"SELECT 條碼,代碼,狀態,時間 FROM [Excel 12.0;Database=C:\Users\X\Desktop\TEST\scra.xls].[$A1:N]  " & _
"WHERE 條碼 IS NOT NULL      UNION ALL  " & _
"            SELECT 條碼,代碼,狀態,時間 FROM [Excel 12.0;Database=C:\Users\X\Desktop\TEST\SHIPP.xls].[$A1:N]  " & _
"            WHERE 條碼 IS NOT NULL) group by 條碼 ) as cc   " & _
"on bb.條碼  = cc.條碼  and  bb.時間 = cc.sj) as ee on aa.條碼  = ee.條碼  "
#6
厨师王德榜2020-07-10 15:55
拼凑查询语句,尤其文件较多的时候,这种做法确实很容易把人绕晕。不如遍历所有文件。
大致思路如下:
1、把TT中填入的多个条码装入一个数组。
2、依次打开 shipp/scra/.... 等文件,在文件中查找有无与数组中的条码相同的,
如无,则关闭这个文件,打开下一个文件;如有,则找到日期最大的一条,把代码填充入数组。
   (至于如何查找更高效?用Find()方法,还是直接在当前表中用SQL查询?
     看你自己觉得哪种方式更好,一般相同条码有很多条记录的,我觉得用SQL查询更好,如果记录量不大,用FIND更好。)
3、打开下一个文件,查找,如有且时间更近,则替换新的代码进入数组,关闭文件。
4、遍历所有文件,直到完毕(此时窗口中应该只有主文件TT)。
5、把数组采集到的数据,填写入TT的列中,释放数组。
这个思路实施起来不复杂。代码量也并不多,建议你考虑一下。
#7
sssooosss2020-07-14 14:56
共同学习
1