ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 刚接触SQL,有个小代码大家看一下

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-12-14 04:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
说的不一定对,本人的一点猜测,参见:
http://blog.csdn.net/incognito007/article/details/8293222
欢迎访问。

TA的精华主题

TA的得分主题

发表于 2012-12-16 14:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
incognito 发表于 2012-12-14 04:52
说的不一定对,本人的一点猜测,参见:
http://blog.csdn.net/incognito007/article/details/8293222
欢迎 ...

这个确实不对,高手,我在Access中测试过,楼主的语句没有笔误,等回家后我把附件传上来看看。

TA的精华主题

TA的得分主题

发表于 2012-12-16 14:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Renco 发表于 2012-12-13 20:03
关键在于你在达成什么意思?!
从语句来看,这二段,不起作用的。

我测试过,起作用的啦,回家后我把附件传上来

TA的精华主题

TA的得分主题

发表于 2012-12-16 15:08 | 显示全部楼层
hustnzj 发表于 2012-12-16 14:21
我测试过,起作用的啦,回家后我把附件传上来

这个我也试着做了个ACCESS的,在ACCESS在特定的性况下是起作用的,比如,班级要输入成1,2,3.。如写成一、二、三,就出问题了,从原则上来说,语句这个用法,是想用来排序,比如:明细1/小计1/明细2/小计2/...../明细n/小计n/总计

而这么排序,以字符先后为顺序的,但是以LZ的语句,在特定规律的写法下是可以的,但一但打破这个原则就不会形成上述这种排列了,所以这个语句适用性较差
不过上述是在ACCESS里测试的,而这个语句应当是在EXCEL里应用的,我想应当不会有太多的变化

TA的精华主题

TA的得分主题

发表于 2012-12-17 16:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 wuxiang_123 于 2012-12-17 17:46 编辑

成绩表:
数据源.jpg
查询返回结果:

2012-12-17_172054.png
2012-12-17_172158.png

分析:

语句1:
为楼主的语句,也是最终返回结果,我们暂时先不看它。

语句2:
生成的表为后续语句需要引用的T表。

语句3:
为方便理解(T.班级=班级&"小计"),(T.班级="合计"),我们将其放到返回字段位置(SELECT 后面),然后观察返回结果,从返回结果,也验证了这两个是逻辑表达式,返回的是一个TURE或FALSE的结果。我们知道,在SQL中,TURE可用-1表示,FALSE可用0表示,然后根据这个,我们再来对照语句3的记录进行分析。
从语句3的结果表中,我们可以看到,(T.班级=班级&"小计"),(T.班级="合计"),返回的结果除【班级】字段为NULL外,其它均为0,这两个字段对应的字段标题为【小计】和【合计】。
这里面又涉及到NULL这个特殊的常量值了。NULL表示未知值或结果未知,判断字段是否为NULL只能用IS NULL、ISNULL()和NOT NULL,故【班级】字段为NULL对应的(T.班级=班级&"小计"),(T.班级="合计")返回的均为NULL,而【班级】字段其它的记录对应的小计和合计,由于不存在,故返回FALSE,即0。

语句4:
按【班级】、【小计】和【合计】三个字段对【得分】进行求和汇总,并对返回的结果按【班级】进行升序排序。
NULL在排序中,比任何值都要小,所以按【班级】进行升序排序时,【班级】字段为NULL的值排在最前。

现在我们根据第4个语句返回的结果来看第一个语句的查询结果,从就是说语句1的结果其实是先对语句4的结果按【合计】降序排序、然后按【小计】升序排序,最后才能【班级】升序排序。由于NULL在排序中比任何值都小,故【班级】字段按【合计】降序排序时,【班级】为NULL的值排在最后。排完【合计】字段后再按【小计】排,排完【小计】后,最后才能【班级】排序。
由于结果表不需要【合计】和【小计】字段,所以,语句1就没有像语句4那样,在SELECT后面列出【合计】和【小计】字段。

现在,我们再看看语句1的返回结果,从语句上猜测,原语句编写人应该是希望实现:班级姓名-班级小计-全部合计。但语句却未能实现,若需实现,可以按上面分析修改语句,修改后为:
  1. SELECT T.姓名,T.班级,SUM(T.得分) AS 总得分
  2. FROM (SELECT 姓名,班级,科目,得分
  3. FROM [成绩表$]
  4. UNION ALL
  5. SELECT 班级&"小计" AS 姓名,班级,科目,AVG(得分)
  6. FROM [成绩表$]
  7. GROUP BY 科目,班级
  8. UNION ALL
  9. SELECT "合计" AS 姓名,null AS 班级,科目,AVG(得分)
  10. FROM [成绩表$]
  11. GROUP BY 科目) T
  12. GROUP BY T.姓名,T.班级,(T.班级=班级&"小计"),(T.班级="合计")
  13. ORDER BY (T.姓名="合计") DESC ,T.班级,(T.姓名=班级&"小计") DESC
复制代码
返回的结果为:
2012-12-17_173155.png

实际上,无论(T.班级=班级&"小计"),(T.班级="合计")还是(T.姓名="合计"),(T.姓名=班级&"小计") ,都不影响GROUP BY子句,故完全可以省略,而表别名T,由于不存在字段对应多张表的情况,故也可省略(当然,在ACCESS和Excel中,都可以使用,但其它SQL引擎未必可用),完善的语句为:

  1. SELECT 姓名,班级,SUM(得分) AS 总得分
  2. FROM (SELECT 姓名,班级,科目,得分
  3. FROM [成绩表$]
  4. UNION ALL
  5. SELECT 班级&"小计" AS 姓名,班级,科目,AVG(得分)
  6. FROM [成绩表$]
  7. GROUP BY 科目,班级
  8. UNION ALL
  9. SELECT "合计" AS 姓名,null AS 班级,科目,AVG(得分)
  10. FROM [成绩表$]
  11. GROUP BY 科目)
  12. GROUP BY 姓名,班级
  13. ORDER BY (姓名="合计") DESC ,班级,(姓名=班级&"小计") DESC
复制代码
----------------数据源文件-----------
工作簿1.rar (17.9 KB, 下载次数: 8)



TA的精华主题

TA的得分主题

发表于 2013-2-5 21:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 xwscs 于 2013-2-5 23:41 编辑

楼上最后一个代码单独执行没有问题。
放在交叉表查询的时候,如果删掉group by 后的姓名='合计',姓名=班级&'小计',就出错
语句1:正确(香帅上个帖子的最后一段)
  1. SELECT 姓名,班级,SUM(得分) AS 总得分
  2. FROM (SELECT 姓名,班级,科目,得分
  3. FROM [成绩表$]
  4. UNION ALL
  5. SELECT 班级&'小计' AS 姓名,班级,科目,AVG(得分)
  6. FROM [成绩表$]
  7. GROUP BY 科目,班级
  8. UNION ALL
  9. SELECT '合计' AS 姓名,null AS 班级,科目,AVG(得分)
  10. FROM [成绩表$]
  11. GROUP BY 科目)
  12. GROUP BY 姓名,班级
  13. ORDER BY 姓名='合计' DESC ,班级,姓名=班级&'小计'
复制代码


语句2:出错,在语句1的基础上第一句和最后一句

  1. TRANSFORM SUM(得分) AS 得分1
  2. SELECT 姓名,班级,SUM(得分) AS 总得分
  3. FROM (SELECT 姓名,班级,科目,得分
  4. FROM [成绩表$]
  5. UNION ALL
  6. SELECT 班级&'小计' AS 姓名,班级,科目,AVG(得分)
  7. FROM [成绩表$]
  8. GROUP BY 科目,班级
  9. UNION ALL
  10. SELECT '合计' AS 姓名,null AS 班级,科目,AVG(得分)
  11. FROM [成绩表$]
  12. GROUP BY 科目)
  13. GROUP BY 姓名,班级
  14. ORDER BY 姓名='合计' DESC ,班级,姓名=班级&'小计'
  15. PIVOT 科目
复制代码


语句3:正确,语句2和语句3的区别倒数第三句 group by
  1. TRANSFORM SUM(得分) AS 得分1
  2. SELECT 姓名,班级,SUM(得分) AS 总得分
  3. FROM (SELECT 姓名,班级,科目,得分
  4. FROM [成绩表$]
  5. UNION ALL
  6. SELECT 班级&'小计' AS 姓名,班级,科目,AVG(得分)
  7. FROM [成绩表$]
  8. GROUP BY 科目,班级
  9. UNION ALL
  10. SELECT '合计' AS 姓名,null AS 班级,科目,AVG(得分)
  11. FROM [成绩表$]
  12. GROUP BY 科目)
  13. GROUP BY 姓名,班级,姓名='合计',姓名=班级&'小计'
  14. ORDER BY 姓名='合计' DESC ,班级,姓名=班级&'小计'
  15. PIVOT 科目
复制代码
请指教,为啥group by 后要加姓名='合计',姓名=班级&'小计'呢?
如果说ORDER BY出现的字段必须先在GROUP BY子句声明,那么语句1groupby 后面跟了两个字段,orderby 后面是三个,其中两个没有在groupby出现,也成功了.

语句4:正确,这句和第2句的区别在于pivot 后加了in,group by 后面没有姓名='合计',姓名=班级&'小计' 。
  1. TRANSFORM SUM(得分) AS 得分1
  2. SELECT 姓名,班级,SUM(得分) AS 总得分
  3. FROM (SELECT 姓名,班级,科目,得分
  4. FROM [成绩表$]
  5. UNION ALL
  6. SELECT 班级&'小计' AS 姓名,班级,科目,AVG(得分)
  7. FROM [成绩表$]
  8. GROUP BY 科目,班级
  9. UNION ALL
  10. SELECT '合计' AS 姓名,null AS 班级,科目,AVG(得分)
  11. FROM [成绩表$]
  12. GROUP BY 科目)
  13. GROUP BY 姓名,班级
  14. ORDER BY 姓名='合计' DESC ,班级,姓名=班级&'小计'
  15. PIVOT 科目 in ('数学','语文','英语')
复制代码

不知道是不是transform 在group by +order by 有啥说法?


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

本版积分规则

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

GMT+8, 2024-11-18 00:20 , Processed in 0.038776 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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