ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 关于SQL在工作簿-工作表之间的查询、排序、转置(盖楼中....)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-11-16 19:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
opiona 发表于 2011-11-16 19:21
Range("a2").CopyFromRecordset y

SQL查询只有一个字段,就是一列

请参阅Scarlett_88版主的
TRANSFORM 语句的详解
http://club.excelhome.net/thread-462590-1-1.html

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-16 19:38 | 显示全部楼层
本帖最后由 opiona 于 2011-11-16 22:07 编辑

先感谢,在学习!

不是很明白,但是成功了!
Strsql = "Select [压实度(%)] From [压实度$a18:j29]"   
这是原来的SQL语句
Strsql = "TRANSFORM sum([压实度(%)])  SELECT  编号 FROM [压实度$a18:j29] GROUP BY 0 PIVOT 编号"
这是转置的SQL
要求字段:编号 是不重复的。
关键是这里的0:GROUP BY 0

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-16 22:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
2011-压实度-000004.rar (15.11 KB, 下载次数: 126)

总体是成功的,但是不知道为什么前面多出来2个空值
代码在附件内

TA的精华主题

TA的得分主题

发表于 2011-11-16 23:13 | 显示全部楼层
对TRANSFORM语句没有研究,加个条件where 编号 is not null:
  1. Sub OPIONA()

  2. Application.ScreenUpdating = False '关闭屏幕刷新
  3. Application.DisplayAlerts = False '关闭提示
  4. Dim Strsql$, Cn As Object
  5. Set y = CreateObject("adodb.recordset")
  6. Set Cn = CreateObject("Adodb.Connection")
  7. Set sh1 = ThisWorkbook.Sheets("汇总表")

  8. Cn.Open "provider=microsoft.jet.oledb.4.0;extended properties='Excel 8.0;HDR=yes;imex=2';data source=" & ThisWorkbook.FullName
  9. 'Strsql = "Select [压实度(%)] From [压实度$a18:j29]"    '获取
  10. Strsql = "TRANSFORM sum([压实度(%)]) as YY  SELECT  编号 FROM [压实度$a3:j14] where 编号 is not null GROUP BY 0 PIVOT 编号"

  11. Set y = Cn.Execute(Strsql)
  12. sh1.Range("b5:L5").ClearContents

  13. For i = 0 To y.Fields.Count - 1
  14. Cells(4, i + 2) = y.Fields(i).Name
  15. Next i

  16. sh1.Range("b5").CopyFromRecordset y

  17. Cn.Close

  18. Application.ScreenUpdating = True
  19. Application.DisplayAlerts = True
  20. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-18 22:30 | 显示全部楼层
本帖最后由 opiona 于 2011-11-18 23:05 编辑

又来SQL的问题了:
我想在SQL的查询结果中继续查询,试图将附件中的代码写成一句SQL:
  1. SQL = " SELECT 日期,sum(数值合计),sum(数值个数),sum(合计),sum(个数) from  "
  2. SQL = SQL & " (SELECT 日期,sum(数值) as 数值合计,COUNT(数值) as 数值个数,0,0 from [Sheet1$a1:b18] where 数值>0 GROUP BY 日期 "
  3. SQL = SQL & " Union ALL"
  4. SQL = SQL & " select 日期,0,0,sum(数值) as 合计,COUNT(数值) as 个数 from [Sheet1$a1:b18] where 数值<0 GROUP BY 日期)"
  5. SQL = SQL & " GROUP BY 日期"
复制代码
我的本意是:将两个分类汇总(一个是大于0的合计和个数,另一个是小于0的合计和个数)
连接成一个5个字段的数据表:日期、数值合计、数值个数、合计、个数
然后在用SQL在这个虚拟(不可见)的数据表中查询
但是总是提示错误,大侠帮忙看看!
用SQL在SQL查询结果中查询.rar (13.86 KB, 下载次数: 91)

写成下面的样子也不行,结果全是大于0的,:

  1. SQL = " SELECT 日期,sum(数值合计),sum(数值个数),sum(合计),sum(个数) from  "
  2. SQL = SQL & " (SELECT 日期,sum(数值) as 数值合计,COUNT(数值) as 数值个数,sum(数值) as 合计,COUNT(数值) as 个数 from [Sheet1$a1:b18] where 数值>0 GROUP BY 日期 "
  3. SQL = SQL & " Union ALL"
  4. SQL = SQL & " select 日期,sum(数值) as 数值合计,COUNT(数值) as 数值个数,sum(数值) as 合计,COUNT(数值) as 个数 from [Sheet1$a1:b18] where 数值<0 GROUP BY 日期)"
  5. SQL = SQL & " GROUP BY 日期"
复制代码
大侠给了另一种写法:
  1. SQL = "select 日期,sum(iif(数值>0,数值,0)),sum(iif(数值>0,1,0)),sum(iif(数值<0,数值,0)),sum(iif(数值<0,1,0)) from [sheet1$a1:b18] group by 日期"
复制代码
还是想知道:
用SQL的查询结果临时建立一个表,用SQL在这个虚拟(不可见)的数据表中继续另外一个查询
一般SQL怎么写呢?  能否发几个经典例句。


TA的精华主题

TA的得分主题

发表于 2011-11-18 23:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
opiona 发表于 2011-11-18 22:30
又来SQL的问题了:
我想在SQL的查询结果中继续查询,试图将附件中的代码写成一句SQL:
我的本意是:将两个 ...

对SQL研究不够,可以在论坛上搜一下:
SQL = "SELECT 日期,sum(iif(数值>0,数值,0)) as 数值合计,sum(iif(数值>0,1,0)) as 数值个数,sum(iif(数值<0,数值,0)) as 合计,sum(iif(数值<0,1,0)) as 个数 from [Sheet1$a1:b18] GROUP BY 日期"

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-19 11:27 | 显示全部楼层
本帖最后由 opiona 于 2011-11-20 11:01 编辑

这句我看明白了,也测试成功,没有问题,十分简练的SQL语句
我想知道的是:
如何 连接几个SQL查询结果组成一个数据表,
第一个查询结果的字段: 日期 大于0数值的和 大于0数值的个数
第二个查询结果的字段: 日期 小于0数值的和 小于0数值的个数
想用他们建立一个新表,字段为:日期 大于0数值的和 大于0数值的个数 小于0数值的和 小于0数值的个数

如何使两个查询结果都变成含5个字段的样子
见过使用0 或者null占位的用法,具体如何使用呢?
SUM(数值)等函数组成的字段,用什么占位呢?

TA的精华主题

TA的得分主题

发表于 2011-11-19 13:32 | 显示全部楼层
opiona 发表于 2011-11-19 11:27
这句我看明白了,也测试成功,没有问题,十分简练的SQL语句
我想知道的是:
如何 连接几个SQL查询结果组成 ...

SQL = " SELECT 日期,sum(数值合计),sum(数值个数),sum(合计),sum(个数) from  "
SQL = SQL & " (SELECT 日期,sum(数值) as 数值合计,COUNT(数值) as 数值个数,0 as 合计,0 as 个数 from [Sheet1$a1:b18] where 数值>0 GROUP BY 日期 "
SQL = SQL & " Union ALL"
SQL = SQL & " select 日期,0 as 数值合计,0 as 数值个数,sum(数值) as 合计,COUNT(数值)as 个数 from [Sheet1$a1:b18] where 数值<0 GROUP BY 日期) group by 日期"

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-19 13:59 | 显示全部楼层

在SQL语句中使用 0 或者 null 占据字段位置

本帖最后由 opiona 于 2011-11-21 11:57 编辑

高手就是高手,一出手就知有没有!


  1. 在SQL语句中可以使用 0 或者 null 占据字段位置,
  2. 0 as 字段名
  3. null as 字段名

  4. SQL = " SELECT 日期,null,sum(数值个数),0 as 合计,sum(个数) from  [Sheet1$]"
  5. 在查询结果中相应字段位置就会全部是0 或者 null

  6. SQL = " SELECT 日期,sum(数值合计),sum(数值个数),sum(合计),sum(个数) from  "
  7. SQL = SQL & " (SELECT 日期,sum(数值) as 数值合计,COUNT(数值) as 数值个数,0 as 合计,0 as 个数 from [Sheet1$a1:b18] where 数值>0 GROUP BY 日期 "
  8. SQL = SQL & " Union ALL"
  9. SQ
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-27 22:32 | 显示全部楼层
本帖最后由 opiona 于 2011-11-28 10:20 编辑

Book1.rar (552.56 KB, 下载次数: 77)
这里有两个表,字段为:英语,外语
目的是:以英语为联系纽带,获得其他两种语言的对应关系
在Sheet2查找Sheet1中的英语,将查到的结果(俄语)按照对应英语在Sheet1的顺序,粘贴到C列
这样ABC三列就是英语,汉语,俄语对应关系了。
(SQL写的查询结果是Sheet2的英语,是因为俄语难以校对结果是否正确)

SQL = "select b.工资 from [Sheet1$] a left join [Sheet2$] b on a.姓名=b.姓名"
斑竹给的这句我一直在用,效果很好,
但是在这个表内却不好用,查询到的结果和原来的Sheet1的英语顺序对不上。

使用公式:=VLOOKUP(A:A,Sheet2!A:B,2,1)  结果就没有问题



  1. 原来原因是英语中有重复数据啊!
  2. 现在先提取不重复数据,组建两个新表,然后再执行版主的SQL,好用! 哈哈!
  3.     cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;hdr=no';Data Source=" & ThisWorkbook.FullName
  4.     SQL = ""
  5.     SQL = SQL & "select b.英语,a.外语,b.外语 from ("
  6.     SQL = SQL & "select DISTINCT f1 as 英语,f2 as 外语 from [Sheet1$]"
  7.     SQL = SQL & ") a left join ("
  8.     SQL = SQL & "select DISTINCT f1 as 英语,f2 as 外语  from [Sheet2$]"
  9.     SQL = SQL & ") b on a.英语=b.英语"
复制代码

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 08:57 , Processed in 0.039394 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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