ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 分享我的SQL语句的数据模板,并请大师们辅导优化方向

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-9-3 03:18 | 显示全部楼层 |阅读模式
这是我做的一个简单的数据模型,我公司是一家土地开发企业,对于以前拆迁征地的农民,现在每年还需付给他们生活费用,这些人分为保障、下待岗、待退休等类型,按不同的年龄与政策情况,有不同的标准,而且,随着年龄的增加,下待岗的人员会转化为待退休的人员,直到他们到法定退休年龄,公司才不再有支付义务。
我先是根据人员清单,用工式自动得出他们到每个人退休每年所处的岗位状态,见【人员数据$】,再列出每年的标准,见【标准$】,为了实现增长率的动态敏感性分析,又做了【增长系数】,只要调整系数,标准就会自动更新。以上是基础数据来源。
然后我用SQL语句将每个年度的数据进行连接,每年的语句为:select a.*,b.姓名,b.性别,b.身份证号 from [标准$]a,(select 2010 as 年,* from [人员数据$])b  where a.年=b.年 and a.岗位状态=b.[2010岗位状态] and a.[征地单位]=b.[征地单位]
然后我把40几年的数据用union all 平行连接,形成了数据汇总,最后再透视分析。
我的问题是,由于年数过多,有40几年,在SQL输入框中,语句字数太多,超过字数限制,无法把union all的语句一次完成,我只好把数据分成三段,为【2023年以前】【2037年以前】【2045年以前】形成三个数据查询表,然后再把这三个SQL表用union all连接起来,才得到完整的数据,实在是辛苦啊。
不知高手们有无一次到位的绝招?

模板.rar

222.35 KB, 下载次数: 62

TA的精华主题

TA的得分主题

发表于 2010-9-3 08:32 | 显示全部楼层
参考下,年份作为列来设计表,是一个需要克服的点,用多重合并透视,然后明细数据,得到如sheet2的结果,然后sheet2和“标准”表对比,SQL透视,如Sheet3,结果和楼主的一致,供参考:
模板.rar (358.56 KB, 下载次数: 38)

TA的精华主题

TA的得分主题

发表于 2010-9-3 10:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
marked!

studying

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-9-3 15:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
轮回大师,之所以原数据中是每年分了一个列,是由于每年的状态是用公式来计算出来的.多重合并透视是如何操作的?可否再简单说说?另:如果是用您的方法,那如果我的原始数据变了,就需要再做一次多重合并透视,这点来说就不太方便了,可否用SQL生成一个与您的sheet2一样的表格,但是可以更新呢?这样双SQL表格也就解决了问题.

[ 本帖最后由 pdamen 于 2010-9-3 15:15 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-9-3 17:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. select a.*,b.姓名,b.性别,b.身份证号 from [标准$]A,
  2. (select *,2010 as 年,[2010岗位状态] as 岗位状态 from [人员数据$] union all
  3. select *,2011,[2011岗位状态] from [人员数据$] union all
  4. select *,2012,[2012岗位状态] from [人员数据$] union all
  5. select *,2013,[2013岗位状态] from [人员数据$] union all
  6. select *,2014,[2014岗位状态] from [人员数据$] union all
  7. select *,2015,[2015岗位状态] from [人员数据$] union all
  8. select *,2016,[2016岗位状态] from [人员数据$] union all
  9. select *,2017,[2017岗位状态] from [人员数据$] union all
  10. select *,2018,[2018岗位状态] from [人员数据$] union all
  11. select *,2019,[2019岗位状态] from [人员数据$] union all
  12. select *,2020,[2020岗位状态] from [人员数据$] union all
  13. select *,2021,[2021岗位状态] from [人员数据$] union all
  14. select *,2022,[2022岗位状态] from [人员数据$] union all
  15. select *,2023,[2023岗位状态] from [人员数据$] union all
  16. select *,2024,[2024岗位状态] from [人员数据$] union all
  17. select *,2025,[2025岗位状态] from [人员数据$] union all
  18. select *,2026,[2026岗位状态] from [人员数据$] union all
  19. select *,2027,[2027岗位状态] from [人员数据$] union all
  20. select *,2028,[2028岗位状态] from [人员数据$] union all
  21. select *,2029,[2029岗位状态] from [人员数据$] union all
  22. select *,2030,[2030岗位状态] from [人员数据$] union all
  23. select *,2031,[2031岗位状态] from [人员数据$] union all
  24. select *,2032,[2032岗位状态] from [人员数据$] union all
  25. select *,2033,[2033岗位状态] from [人员数据$] union all
  26. select *,2034,[2034岗位状态] from [人员数据$] union all
  27. select *,2035,[2035岗位状态] from [人员数据$] union all
  28. select *,2036,[2036岗位状态] from [人员数据$] union all
  29. select *,2037,[2037岗位状态] from [人员数据$] union all
  30. select *,2038,[2038岗位状态] from [人员数据$] union all
  31. select *,2039,[2039岗位状态] from [人员数据$] union all
  32. select *,2040,[2040岗位状态] from [人员数据$] union all
  33. select *,2041,[2041岗位状态] from [人员数据$] union all
  34. select *,2042,[2042岗位状态] from [人员数据$] union all
  35. select *,2043,[2043岗位状态] from [人员数据$] union all
  36. select *,2044,[2044岗位状态] from [人员数据$] union all
  37. select *,2045,[2045岗位状态] from [人员数据$])B
  38. where a.年=b.年 and a.岗位状态=b.岗位状态 and a.[征地单位]=b.[征地单位]
复制代码

模板.rar

261.07 KB, 下载次数: 32

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-9-3 18:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢吴想大侠的语句,果真是轻灵飘逸,出手不凡啊!
简单地品析一下,我原来的语句相当于:A=(B*1)+(B*2)+(B*3)+-------(b*45),而吴想大侠的语句则是:A=B*(1+2+3+----45)
提取了公因子,减肥效果相当明显!
另外 ,大家注意一下这段语句:select *,2011,[2011岗位状态] from [人员数据$] union all
这段语句看以重复,将过多的字段取入,但是这段语句形成的B表再后来与A进行联结后,重复的字段全部舍去,但是语句的字数却省了许多,又是技巧所在啊。
大家不知体会没有吴想大侠的高妙之处?

[ 本帖最后由 pdamen 于 2010-9-3 20:06 编辑 ]

TA的精华主题

TA的得分主题

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

回复 6楼 pdamen 的帖子

5楼没有考虑笛卡尔积,数据有重复时,会出现数据虚增.要解决,就要变一下.LS可以思考下,如何防止笛卡尔积.
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 19:30 , Processed in 0.040883 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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