ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 关于 group by~

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-3-26 11:34 | 显示全部楼层 |阅读模式
问题1;group by为什么非附带上学生不可。有的时候很清楚什么时候需要group by 有的时候很糊涂,我觉得这里只需要写班级就好了,麻烦解释解释
问题2;解释语句2的原理

OMG.rar

13.81 KB, 下载次数: 13

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-3-26 22:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 gpk 于 2015-3-26 23:35 编辑

1、transform语句可以把中间的select语句抽离,单独运行的,这部分语句生成转置后表格的行字段部分,分组不同导致结果不同:
1.png

2.png



transform语句中:transform后面跟着的是聚合函数,值字段是文本值,一般我会这么写:
  1. transform first(学生) select 班级 from [班级干部表$] group by 班级,学生 pivot 职务
复制代码
不知道楼主这个transform后面不用聚合函数,直接用字段的方法出处是那里,望告知



2、语句2(transform first(学生) select max(班级) as 班级 from [班级干部表$] group by 班级+学生 pivot 职务):first是聚合函数,first(学生) ,数据按照行字段分组后,值字段取学生字段的第一个;如果数据源修改下,031班班长是甲还有乙,first(学生)就是只显示甲,如果是last(学生),就是只显示乙
3.png

4.png


至于楼主问的max,倒是不难理解,max和min函数也可以用于文本列,获取按字母顺序排列的最高或者最低值
我只是觉得这里用max()是配合后面group by 班级+学生 这种写法的,因为一般group by 后面多个字段是按照逗号分开的
  • transform first(学生) select max(班级) as 班级 from [班级干部表$] group by 班级+学生 pivot 职务    语句能返回结果
  • transform first(学生) select max(班级) as 班级 from [班级干部表$] group by 班级,学生 pivot 职务     语句能返回结果
上面两个语句结果是一样的,
  • transform first(学生) select 班级 as 班级 from [班级干部表$] group by 班级+学生 pivot 职务            语句报错
  • transform first(学生) select 班级 as 班级 from [班级干部表$] group by 班级,学生 pivot 职务              语句能返回结果

也就是说select语句使用聚合函数时,group by 后面多个字段可以用+,也可以用,连接
而select语句 不使用聚合函数时,group by 后面多个字段不能用+,只能用,连接





评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-3-27 09:14 | 显示全部楼层
transform语法:
transform 值字段
SELECT 行字段1,…,行字段X FROM 表
GROUP BY 分组依据
PIVOT 列字段

问题一:
对值字段使用聚合函数不是必须的,当值字段作为GROUP BY子句或列字段时,可以不使用聚合函数,否则需要使用聚合函数来确保值字段根据GROUP BY子句和列字段在生成的转置表中记录唯一。
故:
transform 学生 select 班级 from [班级干部表$] group by 班级 pivot 职务
报错,而
transform 学生 select 班级 from [班级干部表$] group by 班级,学生 pivot 职务
可以运行。

问题2:
【+运算符】:
1:作为四则运算符中加号,进行加法运算。
2:作为文本连接符,作用等同于“&”
数据源中,【班级】和【学生】字段均为文本数据类型,故【+】在此处作为文本连接符,相当于“&”。
【select max(班级) as 班级 from [班级干部表$] group by 班级+学生】
此部分的意思是:根据班级+学生构成一个新字段,然后根据这个新字段对【班级干部表】的记录进行分组,并取每个分组下的班级最大值。
【select max(班级) as 班级 from [班级干部表$] group by 班级+学生】与【select max(班级) as 班级 from [班级干部表$] group by 班级,学生】,
通常两者返回的结果是相同的,但表达的意义不同。当存在【班级】与【学生】记录不同,但【班级+学生】记录相同时,【班级+学生】与【班级,学生】作为分组依据,其聚合函数返回的结果将不同。
让我们在数据源中增加以下两条记录,然后对比两个语句的返回结果,就可以清晰看到区别。

数据源:
1.png

GROUP BY 班级+学生:
2.jpg

GROUP BY 班级,学生:
3.jpg

就此部分来说,建议使用【group by 班级,学生】而非【group by 班级+学生】,一是为了避免上面所说的特殊情况(当然楼主的数据源是不存在的),二是为了提速。当“+”充当“&”时,同样地,会降低语句运行效率,在数据大时对比更明显。
关于MAX和FIRST。在这里,由于GROUP BY字段分组后的记录已经是相同或唯一,故使用MAX、MIN、FIRST、LAST其结果都是一样的。任选一即可。
从这个语句来说,建议使用:
transform 学生 select 班级 from [班级干部表$] group by 班级,学生 pivot 职务

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-27 09:44 | 显示全部楼层
1.用select +group by解释我就明白了。select里如果只接班级不接学生,相当于跟学生字段无关了,相当于把班级合并同类项。在select里是单独使用可以刷成功的
  但是拿到transform里会丢失行字段
2.transform后面如果跟文本的话我就是这么来的,so我看到后面加first反而觉得奇怪,所以特意提问

感谢费心

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-28 14:33 | 显示全部楼层
也就是说用“+”来并联两个字段不是那么稳妥

TA的精华主题

TA的得分主题

发表于 2015-3-28 22:17 | 显示全部楼层
终于明白transform这个语句了,好贴!~

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-17 05:51 , Processed in 0.034277 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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