Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5705|回复: 15

[已解决]请高手帮忙看一下,多表sql汇总求和问题

[复制链接]
发表于 2015-1-24 14:30 | 显示全部楼层 |阅读模式
本帖最后由 依雪茗香 于 2015-1-24 16:17 编辑

数量查询.rar (22.69 KB, 下载次数: 12)
 楼主| 发表于 2015-1-24 22:27 | 显示全部楼层
自己顶一下,麻烦高手帮忙看看,谢谢。
回复

使用道具 举报

发表于 2015-1-24 23:46 | 显示全部楼层
本帖最后由 芐雨 于 2015-1-24 23:47 编辑

表1,2,3的D列,列名是不一样,用无中生用,创建列名让他们对应就好
表3的是D列列名应该修改为C数量才对应
加上了年的限制
  1. <blockquote>Sub t()
复制代码
附件:
数量查询_SQL.zip (23.84 KB, 下载次数: 13)
回复

使用道具 举报

发表于 2015-1-24 23:49 | 显示全部楼层    本楼为最佳答案   
本帖最后由 芐雨 于 2015-1-25 10:13 编辑

用数组更简单
  1. Sub t()
  2.     Dim arr, brr, i&, j&, n%
  3.     Dim y%, h%, k%
  4.     y = [B1]: h = [D1]   '等到年,月
  5.     ReDim brr(1 To 31, 1 To 4)    ' 创建数组
  6.     [A3:D33].ClearContents
  7.     For k = 1 To 3
  8.     'CStr(k) 把数字转化成文本,Sheets(CStr(k))得到工作表
  9.         arr = Sheets(CStr(k)).Range("A1:D" & Sheets(CStr(k)).Cells(Rows.Count, 1).End(3).Row)
  10.         For i = 2 To UBound(arr)  '遍历数组
  11.             If arr(i, 1) = y And arr(i, 2) = h Then '年,月相等时
  12.                 If arr(i, 3) > n Then n = arr(i, 3)       '记录最大天数日期
  13.                 brr(arr(i, 3), k + 1) = brr(arr(i, 3), k + 1) + arr(i, 4) '汇总
  14.             End If
  15.         Next
  16.     Next
  17.     If n = 0 Then Exit Sub    '没有数据,退出
  18.     For i = 1 To n: brr(i, 1) = i: Next   '日,赋值
  19.     Range("A3").Resize(n, 4) = brr        '写入单元格
  20. End Sub
复制代码
附件:
数量查询_数组.zip (24.93 KB, 下载次数: 11)
回复

使用道具 举报

 楼主| 发表于 2015-1-25 10:06 | 显示全部楼层
芐雨 发表于 2015-1-24 23:49
用数组更简单附件:

非常感谢,数组我不太明白,能不能麻烦写下解释,谢谢了。
SQL是听了兰版的课才开始弄的,再请问下,如果有不同的列,汇总到同一个虚拟表的话,要怎么实现呢?兰版的课里只说了二表的合并,没说三表或三表以上的合并汇总。
这里的0,是不是就是你说的无中生有?如果我日期不分年月日,直接是一个个的日期,这样会不会简单些了?
回复

使用道具 举报

发表于 2015-1-25 10:18 | 显示全部楼层
依雪茗香 发表于 2015-1-25 10:06
非常感谢,数组我不太明白,能不能麻烦写下解释,谢谢了。
SQL是听了兰版的课才开始弄的,再请问下,如果 ...

1. 4楼已更新
2. 上面的例子就是不同列汇总在一起,二表跟三表区别不大,方法是一样的
3. 看实际情况,你的例子,分开会更简单。
回复

使用道具 举报

发表于 2015-1-25 11:24 | 显示全部楼层
依雪茗香 发表于 2015-1-25 10:06
非常感谢,数组我不太明白,能不能麻烦写下解释,谢谢了。
SQL是听了兰版的课才开始弄的,再请问下,如果 ...

sql 写法参考一下
数量查询1.rar (28.03 KB, 下载次数: 8)
回复

使用道具 举报

发表于 2015-1-25 11:33 | 显示全部楼层
芐雨 发表于 2015-1-25 10:18
1. 4楼已更新
2. 上面的例子就是不同列汇总在一起,二表跟三表区别不大,方法是一样的
3. 看实际情况, ...

说明一下原来的代码:
第一、思路上有问题,像这种结构的数据返回可以有两种方法
         1、交叉查询(transform)
         2、连接查询(左、右、全连接)
第二、现有语句中
         1、A数量、B数量、C数量求和之前,你可以想象一下sq返回的结果中有没有这几个字段存在。
         2、sum(C数量), 这个逗号是不是该要。
         3、[d1]这个简写在这里是否可以通过,建议写成Sheets("查询汇总").Range("D1")
下面是我录制的jia
http://www.excelpx.com/thread-337125-1-1.html
回复

使用道具 举报

发表于 2015-1-25 12:21 | 显示全部楼层
JLxiangwei 发表于 2015-1-25 11:33
说明一下原来的代码:
第一、思路上有问题,像这种结构的数据返回可以有两种方法
         1、交叉查询 ...

1. 交叉查询是比较简洁,是个不错的方法,但对于初学者来说,应该补充没有的几个字段,直接用Union All来合并会比较好理解吧,300W左右的数据两者速度都是少于1秒的。
2. Excel 应该不能直接用全连接吧

[d1] 是可以使用的
可可,你居然来打广告!{:021:}
回复

使用道具 举报

 楼主| 发表于 2015-1-25 12:27 | 显示全部楼层
芐雨 发表于 2015-1-25 10:18
1. 4楼已更新
2. 上面的例子就是不同列汇总在一起,二表跟三表区别不大,方法是一样的
3. 看实际情况, ...

谢谢你的回复,再请问一下,如果工作表命名不是123,那'CStr(k) 把数字转化成文本,Sheets(CStr(k))得到工作表这句要怎么写呢?
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-4 22:25 , Processed in 0.333356 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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