|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
张雄友 发表于 2012-11-27 19:43
今天在工作中测试了整整一天都没有成功,不知怎么回事?我在工号前插入了一列人数,就什么也不出来了,请 ...
1:理解明细$A:F
- 明细$A:F表示的是明细工作表中A-F列的有效记录区域作为查询源表。
- 使用明细$A:F原因在于你第一次的附件中,包含无意义内容(原因在于在数据源表中的单元格描述问题),使用指定区域,使查询语句以指定区域为数据源来查询,从而忽略由问题描述产生无意义字段。
- 对于你的新附件,由于你在A中插入了一列人数,此时“收入”字段从原来的F列变为G列,那么,查询语句在A:F区域检测时,是无法找到“收入”字段,必然会出现提示:“参数不足,期待为1”。意思是在明细工作表的A-F列区域中无法找到“收入”这个字段名称。
- 如果你希望对整个工作表作为查询源表,可以直接去掉指定区域,即改为:明细$。那么即使插入了人数列,但“收入”字段还是能检索到的,因为“收入”字段仍在明细工作表中。
复制代码 2:理解聚合函数和分组:
- 聚合函数和分组通常(是通常,不是必须)会结合使用,如果不指定分组(GROUP BY子句),那么聚合函数对整个表进行汇总(汇总方式取决于所使用的聚合函数)。若使用分组(GROUP BY子句),则按GROUP BY子句后列出的字段组合的组对记录进行汇总。
复制代码 举例:
- SELECT 车间,组别, MAX(收入) AS 最大值 FROM [明细$] GROUP BY 车间,组别
复制代码 此语句的意思是查询同一车间、同一组别下,收入的最大值。
再看下面语句:
- SELECT MAX(A.工号) AS 工号,A.车间,A.组别,A.入厂日期,A.职务代码,A.收入 FROM [明细$]A,(SELECT 车间,组别, MAX(收入) AS 最大值 FROM [明细$] GROUP BY 车间,组别)B
- WHERE A.车间=B.车间 AND A.组别=B.组别 AND A.收入=B.最大值
- GROUP BY A.车间,A.组别,A.入厂日期,A.职务代码,A.收入
- ORDER BY A.车间,A.组别,A.收入
复制代码 WHERE 条件中,A.车间=B.车间 AND A.组别=B.组别 AND A.收入=B.最大值的意思是,A、B两表在同一车间、同一组别下,A表的收入要等于B表的最大值。从而获取A表同一车间、同一组别的收入最大值。
执行WHERE子句后,接着语句就执行GROUP BY子句:
- GROUP BY A.车间,A.组别,A.入厂日期,A.职务代码,A.收入
复制代码 这个句子的意思是按A表的同一车间、同一组别、同一入厂日期、同一职务代码、同一收入进行分组。也就是说将车间、组别、入厂日期、职务代码、收入均相同的记录分为一组。接着再来看此部分:
- SELECT MAX(A.工号) AS 工号,A.车间,A.组别,A.入厂日期,A.职务代码,A.收入 FROM [明细$]
复制代码 MAX聚合函数根据上面的GROUP BY子句进行分组统计,也就是说:以车间、组别、入厂日期、职务代码、收入均相同的记录划分组别,然后返回每个组别中的工号最大值。从而实现即使收入相同,工号也是唯一。
猜测你使用的语句:
- SELECT A.人数,MAX(A.工号) AS 工号,A.车间,A.组别,A.入厂日期,A.职务代码,A.收入 FROM [明细$]A,(SELECT 车间,组别, MAX(收入) AS 最大值 FROM [明细$] GROUP BY 车间,组别)B
- WHERE A.车间=B.车间 AND A.组别=B.组别 AND A.收入=B.最大值
- GROUP BY A.车间,A.组别,A.入厂日期,A.职务代码,A.收入,A.人数
- ORDER BY A.车间,A.组别,A.收入
复制代码 此时,可以发现,同一车间、同一组别下存在两个相同的最大收入值,并没有实现记录唯一。为什么呢?因为在与GROUP BY子句。
- GROUP BY A.车间,A.组别,A.入厂日期,A.职务代码,A.收入,A.人数
复制代码 此部分是将记录按车间、组别。入厂日期。职务代码、收入和人数进行分组,而已,我们可以看到,在数据源中,人数是不重复的,虽然在车间、组别中(B表)我们已经提取了最大值,但由于GROUP BY子句,使得MAX(A.工号)并不止按车间和组别划分,还按人数划分,如工号:002和002333,虽然他们在同一车间同一组别,但他们的人数字段的记录是不同的,所以,他们划分在不同的组别,从而都被返回。
解决方法:
- SELECT FIRST(A.人数) AS 人数,FIRST(A.工号) AS 工号,A.车间,A.组别,A.入厂日期,A.职务代码,A.收入 FROM [明细$]A,(SELECT 车间,组别, MAX(收入) AS 最大值 FROM [明细$] GROUP BY 车间,组别)B
- WHERE A.车间=B.车间 AND A.组别=B.组别 AND A.收入=B.最大值
- GROUP BY A.车间,A.组别,A.入厂日期,A.职务代码,A.收入
- ORDER BY A.车间,A.组别,A.收入
复制代码
|
评分
-
1
查看全部评分
-
|