ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] order by 求助

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-28 06:54 | 显示全部楼层
难道是FIRST 函数没有发生作用?

TA的精华主题

TA的得分主题

发表于 2012-11-28 12:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
张雄友 发表于 2012-11-27 19:43
今天在工作中测试了整整一天都没有成功,不知怎么回事?我在工号前插入了一列人数,就什么也不出来了,请 ...

1:理解明细$A:F

  1. 明细$A:F表示的是明细工作表中A-F列的有效记录区域作为查询源表。
  2. 使用明细$A:F原因在于你第一次的附件中,包含无意义内容(原因在于在数据源表中的单元格描述问题),使用指定区域,使查询语句以指定区域为数据源来查询,从而忽略由问题描述产生无意义字段。
  3. 对于你的新附件,由于你在A中插入了一列人数,此时“收入”字段从原来的F列变为G列,那么,查询语句在A:F区域检测时,是无法找到“收入”字段,必然会出现提示:“参数不足,期待为1”。意思是在明细工作表的A-F列区域中无法找到“收入”这个字段名称。
  4. 如果你希望对整个工作表作为查询源表,可以直接去掉指定区域,即改为:明细$。那么即使插入了人数列,但“收入”字段还是能检索到的,因为“收入”字段仍在明细工作表中。
复制代码
2:理解聚合函数和分组:
  1. 聚合函数和分组通常(是通常,不是必须)会结合使用,如果不指定分组(GROUP BY子句),那么聚合函数对整个表进行汇总(汇总方式取决于所使用的聚合函数)。若使用分组(GROUP BY子句),则按GROUP BY子句后列出的字段组合的组对记录进行汇总。
复制代码
举例:
  1. SELECT 车间,组别, MAX(收入) AS 最大值 FROM [明细$] GROUP BY 车间,组别
复制代码
此语句的意思是查询同一车间、同一组别下,收入的最大值。
再看下面语句:

  1. SELECT MAX(A.工号) AS 工号,A.车间,A.组别,A.入厂日期,A.职务代码,A.收入 FROM [明细$]A,(SELECT 车间,组别, MAX(收入) AS 最大值 FROM [明细$] GROUP BY 车间,组别)B
  2. WHERE A.车间=B.车间 AND A.组别=B.组别 AND A.收入=B.最大值
  3. GROUP BY A.车间,A.组别,A.入厂日期,A.职务代码,A.收入
  4. ORDER BY A.车间,A.组别,A.收入
复制代码
WHERE 条件中,A.车间=B.车间 AND A.组别=B.组别 AND A.收入=B.最大值的意思是,A、B两表在同一车间、同一组别下,A表的收入要等于B表的最大值。从而获取A表同一车间、同一组别的收入最大值。
执行WHERE子句后,接着语句就执行GROUP BY子句:
  1. GROUP BY A.车间,A.组别,A.入厂日期,A.职务代码,A.收入
复制代码
这个句子的意思是按A表的同一车间、同一组别、同一入厂日期、同一职务代码、同一收入进行分组。也就是说将车间、组别、入厂日期、职务代码、收入均相同的记录分为一组。接着再来看此部分:
  1. SELECT MAX(A.工号) AS 工号,A.车间,A.组别,A.入厂日期,A.职务代码,A.收入 FROM [明细$]
复制代码
MAX聚合函数根据上面的GROUP BY子句进行分组统计,也就是说:以车间、组别、入厂日期、职务代码、收入均相同的记录划分组别,然后返回每个组别中的工号最大值。从而实现即使收入相同,工号也是唯一。
猜测你使用的语句:
  1. SELECT A.人数,MAX(A.工号) AS 工号,A.车间,A.组别,A.入厂日期,A.职务代码,A.收入 FROM [明细$]A,(SELECT 车间,组别, MAX(收入) AS 最大值 FROM [明细$] GROUP BY 车间,组别)B
  2. WHERE A.车间=B.车间 AND A.组别=B.组别 AND A.收入=B.最大值
  3. GROUP BY A.车间,A.组别,A.入厂日期,A.职务代码,A.收入,A.人数
  4. ORDER BY A.车间,A.组别,A.收入
复制代码
此时,可以发现,同一车间、同一组别下存在两个相同的最大收入值,并没有实现记录唯一。为什么呢?因为在与GROUP BY子句。

  1. GROUP BY A.车间,A.组别,A.入厂日期,A.职务代码,A.收入,A.人数

复制代码
此部分是将记录按车间、组别。入厂日期。职务代码、收入和人数进行分组,而已,我们可以看到,在数据源中,人数是不重复的,虽然在车间、组别中(B表)我们已经提取了最大值,但由于GROUP BY子句,使得MAX(A.工号)并不止按车间和组别划分,还按人数划分,如工号:002和002333,虽然他们在同一车间同一组别,但他们的人数字段的记录是不同的,所以,他们划分在不同的组别,从而都被返回。
解决方法:

  1. SELECT FIRST(A.人数) AS 人数,FIRST(A.工号) AS 工号,A.车间,A.组别,A.入厂日期,A.职务代码,A.收入 FROM [明细$]A,(SELECT 车间,组别, MAX(收入) AS 最大值 FROM [明细$] GROUP BY 车间,组别)B
  2. WHERE A.车间=B.车间 AND A.组别=B.组别 AND A.收入=B.最大值
  3. GROUP BY A.车间,A.组别,A.入厂日期,A.职务代码,A.收入
  4. ORDER BY A.车间,A.组别,A.收入
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-28 13:03 | 显示全部楼层
明白了,中午回公司测试,应该会成功的,谢谢。其实我已经做好了最坏的打算,再不行就把附件复制回来在自己电脑测试,再次感谢。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-28 19:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wuxiang_123 发表于 2012-11-28 12:13
1:理解明细$A:F
2:理解聚合函数和分组:
举例:

终于测试成功,附件数据在于太特殊,所以老是不成功。
第一,SELECT 字段顺序与GROUP BY 字段顺序要一致;
第二,用了聚合函数的字段,GROUP BY 后面的字段就不要该字段了。
严格来说附件这样做更安全,这是下午总结的,不知对不对。
  1. SELECT FIRST(A.人数) AS 人数,FIRST(A.工号) AS 工号,A.车间,A.组别,FIRST(A.入厂日期) AS 入厂日期,FIRST(A.职务代码) AS 职务代码,A.收入 FROM [明细$]A,
  2. (SELECT 车间,组别, MAX(收入) AS 最大值 FROM [明细$] GROUP BY 车间,组别)B
  3. WHERE A.车间=B.车间 AND A.组别=B.组别 AND A.收入=B.最大值 GROUP BY A.车间,A.组别,A.收入 ORDER BY A.车间,A.组别,A.收入
复制代码

TA的精华主题

TA的得分主题

发表于 2012-11-29 09:56 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-11-29 12:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
张雄友 发表于 2012-11-28 19:26
终于测试成功,附件数据在于太特殊,所以老是不成功。
第一,SELECT 字段顺序与GROUP BY 字段顺序要一致 ...

  1. 第一,SELECT 字段顺序与GROUP BY 字段顺序要一致;
复制代码
SELECT 后面列出的字段位置只影响该字段在返回结果中的列位置,GROUP BY子句接的字段顺序无要求,GROUP BY 字段1,字段2和GROUP BY 字段2,字段1的结果都是一样的,都是以这两个字段为依据进行分组。

  1. 第二,用了聚合函数的字段,GROUP BY 后面的字段就不要该字段了。
复制代码
需要视不同情况区别对待。只需要知道:GROUP BY子句比SELECT 后面接的字段要先执行,所以,如果SELECT后面接的字段不在GROUP BY子句中,那么,此字段必须使用聚合函数或该字段是以插入常量的方式。如:
  1. SELECT 科目,性别 FROM 表 GROUP BY 性别
复制代码
此时语句必定报错,因为语句无法为科目按性别进行分组。

  1. SELECT 字段1 FROM 表 GROUP BY 字段1,字段2
复制代码
此语句可以运行,尽管字段2并没有出现在SELECT后面,此时语句返回的结果为字段1按字段1和字段进行分组,只是这样将可能会出现字段1记录重复的结果。(有些情况会用到这种形式语句)

  1. SELECT 1 AS 字段1,字段2 FROM 表 GROUP BY 字段2
复制代码
此语句可以运行,尽管字段1没有出现在GROUP BY后面,如上所说,GROUP BY子句比SELECT后面的字段优先执行,所以此语句的意思是先对记录按字段2进行分组(即执行GROUP BY部分),然后再返回分组后字段2的记录和插入一个由常量1构成的字段1(即执行SELECT部分)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-10-16 09:43 | 显示全部楼层
能有这样的老师,是学生之福,收藏,{:soso_e163:}

TA的精华主题

TA的得分主题

发表于 2014-12-26 12:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
wuxiang_123 发表于 2012-11-22 09:43
域聚合函数:

子查询:

请问下,子查询-EXISTS谓词:
SELECT * FROM [明细$A:F]A
WHERE EXISTS (SELECT 1 FROM [明细$A:F]B WHERE A.车间=B.车间 AND A.组别=B.组别 HAVING A.收入=MAX(B.收入))
ORDER BY 车间,组别,收入     有2处不理解❶书上说where后不能用聚合函数,你这WHERE A.车间=B.车间 AND A.组别=B.组别 HAVING A.收入=MAX(B.收入))用了。❷WHERE A.车间=B.车间 AND A.组别=B.组别 HAVING A.收入=MAX(B.收入))  句中的having 为什么不能用and 呢。请你给指导下,谢谢。

点评

看清楚,聚合函数是在having子句中,不是where子句。另外,having子句并没有限制逻辑运算符,你是不是没有弄清楚语法。  发表于 2014-12-28 01:07
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-9 06:10 , Processed in 0.025699 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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