A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈帅 中级黑马   /  2013-4-18 14:03  /  1376 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈帅 于 2013-4-18 15:44 编辑

数据分组的时候,用group by,假如我有一个数据库MyFirstDB里面建了个表,名为Person,包含了Id(uniqueidentifier类型)、Name(nvarchar(50)类型)、Age(int类型)、Income(int类型)
用select Age as '年龄',COUNT(*) as '数量' from Person2
group by Age 查询,查询到结果
年龄          数量
----------- -----------
19          3
20          2
21          2
22          1
23          1
这个数量记数是按照年龄Age的重复来记数的
继续用select Age as '年龄',Name as '姓名',COUNT(*) as '数量' from Person2
group by Age,Name 查询,查询到结果
年龄          姓名      数量
----------- ------------------  -----------
23          NULL               1
22          东方二         1
21          董七           1
19          李四           2
20          钱三           1
20          王五           1
21          赵六           1
19          诸葛首         1
这个数量记数却竟然是按照姓名Name的重复来记数的
继续查询select Age as '年龄',Name as '姓名',Income as '收入',count(*) as '数量'from Person2
group by Age,Name,Income 查询结果
年龄          姓名      收入          数量
----------- ----------------------- ----------- -----------
19          李四           2000        2
19          诸葛首         2700        1
20          钱三           2700        1
20          王五           2500        1
21          董七           3000        1
21          赵六           2600        1
22          东方二         2200        1
23          NULL                2800        1
这个数量记数竟然仍然是按照姓名Name的重复来记数的
真心求教为何~~

3 个回复

倒序浏览
它是根据你group by 后面的字段来分组的。即:
group by Age  就是根据 Age 分组,即Age相同就为一组,Count(*) 就会加1。
group by Age,Name 就是根据Name分组,即 Age和Name都相同就为一组,Count(*) 就会加1,否则就不是。
同理:group by Age,Name,Income,就是根据Age,Name,Income分组,即Age,Name,Income都相同就为一组,否则就不是。

所以,后面这两个根本不是根据Name分组的。
回复 使用道具 举报
恩  看明白了~~ 谢谢撒~~
回复 使用道具 举报
后面的数据看上去像是按照name分组的其实不是,你数据要是多点就能看出来了。你这三组查询也是按照顺序来的,所以理解起来也方便。
例如
第一组查询中第一个是按照age分组的19岁的有3个好理解。
第二组查询中,可以理解为先  分别 按age和按姓名分好组得

19         
20         
21         
22         
23         
         NULL
         东方二         
         董七           
         李四         
         钱三         
         王五           
         赵六           
         诸葛首  
然后就是19岁中null的人数,19中东方二的人数,19中董七的人数。。。。。
等于就是左边的一列每个项目都把右边的一列给遍历了一遍,相等的count+1

同理第三个就是先分别按三个字段分好组 然后第一列的第一个元素 遍历第二列的第一个元素,这个组合得到的元素组合再遍历第3列元素,直至遍历完。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马