ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 这种形式的多表汇总SQL语句怎么写?(已解决,感谢simon_zhu老师)

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-7-21 14:23 | 显示全部楼层

回复 10楼 Simon_Zhu 的帖子

呵呵,先感谢,再花时间好好消化研究一下。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-7-21 15:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

回复 10楼 Simon_Zhu 的帖子

非常厉害,非常非常佩服。
这段代码让我学到了我以前很多没有碰到的SQL新语句,特别是多工作簿的连接语句以及我不常用的recordset对象,而且代码的适应性很强(个人觉得适应性强于字典)
再次感谢!

TA的精华主题

TA的得分主题

发表于 2010-7-21 15:29 | 显示全部楼层
佩服,这么大段的代码,慢慢研究。VBA+SQL都是我在学习的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-7-21 15:54 | 显示全部楼层

回复 10楼 Simon_Zhu 的帖子

为什么我将union 改成union all 就不能执行了呢?
----------------------
另外:如果分表有重复的项目,是不是得加一个SQL先将分表的源数据进行先期处理,处理成无重复的项目后,才能再执行后面的union和left join两个语句?

[ 本帖最后由 onthetrip 于 2010-7-21 15:59 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-7-21 17:49 | 显示全部楼层
原帖由 onthetrip 于 2010-7-21 15:54 发表
为什么我将union 改成union all 就不能执行了呢?
----------------------
另外:如果分表有重复的项目,是不是得加一个SQL先将分表的源数据进行先期处理,处理成无重复的项目后,才能再执行后面的union和left join两个 ...


可以使用Union all 啊,
Sql = Join(brr, " Union all ") '这里改Union all,注意:Union all前后都有空格。不过为什么要用Union all?

再回答另外:

分表会有什么重复的项目,总共就3个字段:项目名称,单位,数量?记得你的附件中标注过项目名称,单位不重复。
难道是分表里要 "Select 项目名称,单位 ,sum(数量)as 数量 from 分表 group by 项目名称,单位" 这样?如果是这样的话,稍微改写一下Sql=“” 的语句就行了,不需要再Sql先期处理了,参见本楼代码。

Union本身就是去重复的纵向连接,Union all 是不管重复不重复,全部连在一起... 可以参考Sql手册:http://www.w3school.com.cn/sql/sql_union.asp
  1. Sub my_test()
  2.     Dim iCol%, i%, j%, arr(), brr(), m%, n%
  3.     Dim myPath$, myFiles$, Sql$, myField$
  4.     Dim Conn As Object, rst As Object
  5.     Application.ScreenUpdating = False
  6.         myPath = ThisWorkbook.Path
  7.         myFiles = Dir(myPath & "\*.xls")
  8.             Set Conn = CreateObject("Adodb.Connection")
  9.             Set rst = CreateObject("Adodb.Recordset")
  10.                 Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;hdr=yes;';Data Source=" & ThisWorkbook.FullName
  11.                     Sheet1.Cells.ClearContents
  12.                     Do While myFiles <> ""
  13.                         If myFiles <> ThisWorkbook.Name Then
  14.                             ReDim Preserve arr(0 To m)
  15.                             arr(m) = myFiles
  16.                             m = m + 1
  17.                         End If
  18.                         myFiles = Dir
  19.                     Loop
  20.                     For i = 0 To UBound(arr)
  21.                         Sql = "Select 项目名称,单位 from [Excel 8.0;DATABASE=" & myPath & "" & arr(i) & "].[Sheet1$]"
  22.                         ReDim Preserve brr(0 To n)
  23.                         brr(n) = Sql
  24.                         n = n + 1
  25.                     Next i
  26.                     Sql = Join(brr, " Union ")
  27.                     Sql = "Select  * from (" & Sql & ") Order by 项目名称"
  28.                     Sheet1.Range("a2").CopyFromRecordset Conn.Execute(Sql)
  29.                     Set rst = Conn.Execute(Sql)
  30.                     Sheet1.Range("a1") = rst(0).Name
  31.                     Sheet1.Range("b1") = rst(1).Name
  32.                     rst.Close
  33.                     For j = 0 To UBound(arr)
  34.                         iCol = Sheet1.Range("iv1").End(xlToLeft).Column
  35.                         myField = Application.ExecuteExcel4Macro("'" & myPath & "\[" & arr(j) & "]Sheet1'!r1c3")
  36.                         Sql = "Select B." & myField & " from [Sheet1$] as A Left Join (Select 项目名称,单位,Sum(" & myField & ") as " & myField & " from [Excel 8.0;DATABASE=" & myPath & "" & arr(j) & "].[Sheet1$] Group by 项目名称,单位) as B on A.项目名称=B.项目名称 and A.单位=B.单位"
  37.                         Sheet1.Cells(1, iCol + 1) = myField
  38.                         Sheet1.Cells(2, iCol + 1).CopyFromRecordset Conn.Execute(Sql)
  39.                     Next j
  40.                 Conn.Close
  41.             Set rst = Nothing
  42.             Set Conn = Nothing
  43.     Application.ScreenUpdating = True
  44. End Sub
复制代码
供参考

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-7-21 19:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

回复 15楼 Simon_Zhu 的帖子

感激。。。。。,就是这样的
1、我原先的条件确实是不重复,可是为了适应性更强,以防万一重复,因此,我想知道怎样处理有重复的项目
2、union all是我起初想把包括重复的项目全部连接起来后实验一下left join的效果。原来是少了空格的原因。
3、我确实以为要"Select 项目名称,单位 ,sum(数量)as 数量 from 分表 group by 项目名称,单位" 先行处理数据源表,并且也意识到这样处理是很笨拙不合理的,但实在想不出来怎么改后面的语句,所以才有此问
囧自己脑子不会转弯,思维僵化,不会举一反三,唉。。。。。。

[ 本帖最后由 onthetrip 于 2010-7-21 19:25 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-10-21 10:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
为了解决另一个贴找到这儿来的,学习。

TA的精华主题

TA的得分主题

发表于 2013-4-21 22:37 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 07:23 , Processed in 0.030338 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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