黑马程序员技术交流社区
标题:
关于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