ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] Union多表合并的字段对应问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-1-12 20:23 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
用Union合并多个工作表, Select后的字段需要一一对应吗?
假设
Select 品名,买入,卖出,数量,单价,总价...
Union all
Select 数量,单价,总价,品名,买入,卖出...
字段数量和字段名都一样, 但是Select后的位置不一样, 对数据合并有影响吗?合并后的透视表能正常显示吗?

此外

Select *, 0 as 分配金额, 0 as 分配份额
From `基金表格A`.`交易记录$`

Union all
Select 0 as a.*, b.分配金额,b.分配份额
From `基金表格A`.`交易记录$` a, `基金表格A`.分红记录$` b


0 as a.*这个表达式试下来是不对的
那么如果定义了两个工作表别名(a和b), 怎样表达可以将a内所有列全部赋予某个值如0,
除了用as一一定义字段
(其目的是用Union合并同一工作簿内的两个工作表, 且两个工作表字段和字段数都不一样, 通过as命令定义空字段使字段数一样)


谢谢

[ 本帖最后由 newage 于 2010-1-13 13:11 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-1-13 08:39 | 显示全部楼层
以上的示例,可能不会得到楼主需要的结果。

union和union all的区别在于:union对于重复的记录,只选取一条;union all 将选择所有的记录,而不论记录是否有重复。因此,这两个语句的执行速度(当数据量足够大时)是有区别的。

[ 本帖最后由 masterexcel 于 2010-1-13 08:40 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-1-13 09:01 | 显示全部楼层
楼上说得好
union与union all的主要差别就是选取的重复记录不一样!

TA的精华主题

TA的得分主题

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

我已经把上例中的Union改成Union all了
但是理论上对我的提问没有影响, 因为我的数据记录不存在完全重复的情况(单日期一项, 就足以区分)

经过多日痛苦的摸索, 几度接近崩溃, 我已经基本能实现我的意图, 但是我的SQL语句和字数也相当BT
所以才发此问, 希望通过灵活的字段定义方式来简化SQL

按照我的测试, 两表合并时, Select后字段定义的顺序似乎不能随意改变, 必须一一对应, 否则字段与数据错位
不知道是否确实如此, 或者有其他定义的模式?

另外, 我把所附图片和表格删了, 因为与提问不具有直接联系, 只会误导问题的方向

[ 本帖最后由 newage 于 2010-1-13 13:13 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-1-13 14:06 | 显示全部楼层
Select 品名,买入,卖出,数量,单价,总价...
Union all
Select 数量,单价,总价,品名,买入,卖出.
这个字段要一一对应。
union 去掉重复记录,
union all 是链接所有记录
大数据量时,使用union 比union all 要慢。
因为union 是先union all再去掉重复记录

TA的精华主题

TA的得分主题

发表于 2010-1-13 15:11 | 显示全部楼层
原帖由 newage 于 2010-1-13 13:07 发表
感谢回复

我已经把上例中的Union改成Union all了
但是理论上对我的提问没有影响, 因为我的数据记录不存在完全重复的情况(单日期一项, 就足以区分)

经过多日痛苦的摸索, 几度接近崩溃, 我已经基本能实现我的意 ...


一般情况下,列数必须相同。否则出错。

字段必须一一对应,否则出来的结果就不是自己需要的,特殊需求例外。

另外,若各表的字段和列数完全一样,可以用
  1. select * from [table1] union all select * from [table2] union all select * from [table3]
复制代码

TA的精华主题

TA的得分主题

发表于 2010-1-13 17:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
字段必须相对应,不然向这样
Select 品名,买入,卖出,数量,单价,总价...
Union all Select 数量,单价,总价,品名,买入,卖出...,
品名 对 数量,买入 对 单价有什么意义。

如果只是为了重排字段这样就可以了吧:
Select 数量,单价,总价,品名,买入,卖出...  
Union all Select 数量,单价,总价,品名,买入,卖出...

另外,如果第2个数据表缺少某些列可用null替代,如:
Select 数量,单价,总价,品名,买入,卖出...  
Union all Select 数量,单价,总价,品名,买入,null...

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-1-13 17:25 | 显示全部楼层
谢谢
请问是否可以如你所表示的, 直接用null, 还是需用null as 或0 as或"" as等定义
两表合并,在定义字段的时候, 如果同一位置两个表都是null, 是否为无效定义

[ 本帖最后由 newage 于 2010-1-13 17:29 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-1-13 18:30 | 显示全部楼层
直接用null,第一个表的字段不能为空。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-1-13 19:16 | 显示全部楼层
对于缺省列的定义, 我总结如下, 请指正:

null
多表合并时,可用null定义空值,空值在计数汇总里被忽略
对于有计数要求的字段推荐使用
Select后可直接用null表示空值,无需as语句引导
应注意第一个表对应字段值不能为空

0
多表合并时,可用0定义零值,零值仍会计入计数汇总里
对有求和等汇总要求的字段推荐使用
Select后可直接用0表示零值,无需as语句引导

""
多表合并时,可用""定义空字符,空字符不推荐使用
Select后可直接用""表示空字符,无需as语句引导
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-28 10:55 , Processed in 0.053196 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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