黑马程序员技术交流社区

标题: 关于SQLServer语句中的group by [打印本页]

作者: 陈帅    时间: 2013-4-18 14:03
标题: 关于SQLServer语句中的group by
本帖最后由 陈帅 于 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的重复来记数的
真心求教为何~~
作者: 史鹏飞    时间: 2013-4-18 15:14
它是根据你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分组的。
作者: 陈帅    时间: 2013-4-18 15:42
恩  看明白了~~ 谢谢撒~~
作者: 石国庆    时间: 2013-4-18 17:19
后面的数据看上去像是按照name分组的其实不是,你数据要是多点就能看出来了。你这三组查询也是按照顺序来的,所以理解起来也方便。
例如
第一组查询中第一个是按照age分组的19岁的有3个好理解。
第二组查询中,可以理解为先  分别 按age和按姓名分好组得

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

同理第三个就是先分别按三个字段分好组 然后第一列的第一个元素 遍历第二列的第一个元素,这个组合得到的元素组合再遍历第3列元素,直至遍历完。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2