ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 咸味

[求助] VBA 重新合并求SQL,首发给出答案正确采纳发烟一包!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-5-14 16:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
按照z865593849的一行代码对我的代码进行了优化,普适性会更强,数据量大也可以适用,非常非常爽。详见附件。

SQL合并2.rar

27.41 KB, 下载次数: 9

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-14 18:54 | 显示全部楼层
cui26896 发表于 2023-5-14 16:11
你的表做得非常不合理,如果你按我的这个来修改,会更方便些。

源表是子查询做出来的!

TA的精华主题

TA的得分主题

发表于 2023-5-14 22:29 | 显示全部楼层
这个需求,如果硬要用SQL来处理的话,我的解决方案是这样的:
1、代码:
  1. Sub SQL合并()
  2.     Dim Ado As Object
  3.     Dim conString As String
  4.     Dim SQL1 As String, SQL2 As String, SQL3 As String, SQL As String
  5.     Dim 数据库文件路径 As String
  6.     数据库文件路径 = ThisWorkbook.FullName
  7.    
  8.     If Application.Version >= 11 Then
  9.         conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & 数据库文件路径 & ";Extended Properties=""Excel 12.0;HDR=YES"";"
  10.     Else
  11.         conString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & 数据库文件路径 & ";Extended Properties=""Excel 8.0;HDR=YES"";"
  12.     End If
  13.     Set Ado = CreateObject("Adodb.Connection")
  14.     Ado.Open conString
  15.     If Ado.State = 1 Then
  16.         Debug.Print "测试链接成功!"
  17.     Else
  18.         Debug.Print "测试链接失败!"
  19.     End If
  20.     SQL1 = "SELECT 年份,季节,店仓,款号,颜色,S,M,L ,XL ,XXL ,A,B ,FF" & _
  21.             " FROM [源$A1:M] WHERE 年份 <> ''"
  22.    
  23.     SQL2 = "SELECT 年份,季节,店仓,款号,颜色,S,M,L ,XL ,XXL ,A,B ,FF" & _
  24.             " FROM [源$N1:Z] WHERE 年份 <> ''"
  25.    
  26.     SQL3 = SQL1 & " UNION ALL " & SQL2
  27.     SQL3 = "SELECT DISTINCT 年份,季节,店仓,款号,颜色 FROM (" & SQL3 & ")"
  28.    
  29.     SQL = "SELECT A.年份,A.季节,A.店仓,A.款号,A.颜色,B.S,B.M,B.L ,B.XL ,B.XXL ,B.A,B.B ,B.FF " & _
  30.             "FROM (" & SQL3 & ") A " & _
  31.             "LEFT JOIN (" & SQL1 & ") B " & _
  32.             "On A.年份=b.年份 AND A.季节= B.季节 AND A.店仓=B.店仓 AND A.款号=B.款号 AND A.颜色=B.颜色"
  33.    
  34.     SQL = "SELECT A.年份,A.季节,A.店仓,A.款号,A.颜色,A.S,A.M,A.L ,A.XL ,A.XXL ,A.A,A.B ,A.FF,B.S,B.M,B.L ,B.XL ,B.XXL ,B.A,B.B ,B.FF " & _
  35.             "FROM (" & SQL & ") A " & _
  36.             "LEFT JOIN (" & SQL2 & ") B " & _
  37.             "On A.年份=b.年份 AND A.季节= B.季节 AND A.店仓=B.店仓 AND A.款号=B.款号 AND A.颜色=B.颜色"
  38.    
  39.     With ThisWorkbook.Worksheets("模拟结果")
  40.         .UsedRange.Offset(1).Clear
  41.         .Range("A2").CopyFromRecordset Ado.Execute(SQL)
  42.     End With
  43.     Ado.Close
  44. End Sub
复制代码
2.注意事项:需要将数据源处理一下,
表头要统一,且删除没有用的字符,如 "T1." 和 "T2.";
统一格式,统计维度,即源里,标黄的部分要全部转换成文本格式,分列处理一下即可;
3.模拟结果如下:默认排序
image.jpg
4.附件在这里:
SQL合并.rar (20 KB, 下载次数: 6)
最后,祝您生活愉快,推荐使用alipay
76fc6552d7b32cbc6c59282fcc4628a.jpg



image.jpg

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-5-15 13:22 | 显示全部楼层
关键之处在于合并表格取相同表头。用ff是简单的做法,可以用个数组存表头,用循环取表头。
360截图20230515132028635.jpg

SQL合并.rar

19.64 KB, 下载次数: 11

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-16 06:38 | 显示全部楼层
WANT-T 发表于 2023-5-14 22:29
这个需求,如果硬要用SQL来处理的话,我的解决方案是这样的:
1、代码:
2.注意事项:需要将数据源处理一 ...

前面几个老师他们已给出答案!不过您办法也是可行的!不要介意就发个包意思吧!

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-16 06:40 | 显示全部楼层
再次感谢各位老师关注!在此楼封贴!

TA的精华主题

TA的得分主题

发表于 2023-5-20 19:41 | 显示全部楼层
咸味 发表于 2023-5-14 18:54
源表是子查询做出来的!

子查询就更没有道理了,明明是一样的表的结构,非要弄成不同的字段名,字段名中还有保留字“."!很多时候,看提问题的,本身表的结构就很不好,所以给后期做代码带来很大的不便!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 08:28 , Processed in 0.030960 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表