首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请教,GROUP BY多列分组原理

2012-08-21 
请问,GROUP BY多列分组原理第一句SELECT 供货商,货品 FROM 订货单 GROUP BY 供货商,货品供货商货品小张洗

请问,GROUP BY多列分组原理
第一句
SELECT 供货商,货品 FROM 订货单 GROUP BY 供货商,货品

供货商 货品

小张 洗衣粉
小王 饼干
丽丽 醋
熊俊 饼干
熊俊 纯净水

第二句
SELECT 供货商,货品 FROM 订货单 GROUP BY 货品,供货商

供货商 货品

小张 洗衣粉
小王 饼干
熊俊 饼干
丽丽 醋
熊俊 纯净水


问题:
上面2句SQL语句,只变化了GROUP BY后面的分组顺序,输出结果就不一样,请问,在多列分组的时候,是按照什么规则分组的?从上面的句子看起来,最后好像都是按照最前面的分组来显示的哦

[解决办法]
GROUP BY A,B,C的排序与ORDER BY A,B,C的排序一样,
即先按A排,如果A一样,则再按B排,以此类推
[解决办法]
是按group by 后面的字段先后排优先级的

group by A,B 即先按照A进行分组,A相同的,按B分组

group by B,A 即先按照B进行分组,B相同的,按A分组

[解决办法]
默认情况下,排序所有GROUP BY col1,col2,....。查询的方法如同在查询
中指定ORDER BY col1,col2,...。如果显式包括一个包含相同的列的ORDER BY
子句,可以毫不减速地对它进行优化,尽管仍然进行排序
[解决办法]
正解

探讨
是按group by 后面的字段先后排优先级的

group by A,B 即先按照A进行分组,A相同的,按B分组

group by B,A 即先按照B进行分组,B相同的,按A分组

[解决办法]
探讨
是按group by 后面的字段先后排优先级的

group by A,B 即先按照A进行分组,A相同的,按B分组

group by B,A 即先按照B进行分组,B相同的,按A分组

[解决办法]
顶叶子的,输出的结果完全是一样的,只是没有排序。
[解决办法]
查看一下执行计划,会发现,先执行排序,然后才是分组
[解决办法]
group by 后面的字段顺序 只是影响了结果的顺序

不会影响结果的值

如果是 group by a,b
那么就是按照 order by a,b 的顺序分组,因为分组是需要先排序的
反之 group by b,a 就是按照b,a的顺序分组


[解决办法]
SQL code
--> 测试数据:[tb]IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]GO CREATE TABLE [tb]([col1] INT,[col2] INT,[col3] INT)INSERT [tb]SELECT 1,3,5 UNION ALLSELECT 1,3,5 UNION ALLSELECT 2,1,8 UNION ALLSELECT 2,1,8 UNION ALLSELECT 3,2,3 UNION ALLSELECT 3,2,3 UNION ALLSELECT 4,0,NULL UNION ALLSELECT 4,0,NULL--------------开始查询--------------------------SELECT * FROM [tb] GROUP BY [col1] ,[col2] ,[col3]SELECT * FROM [tb] GROUP BY [col3] ,[col2] ,[col1]SELECT * FROM [tb] GROUP BY [col2] ,[col3] ,[col1]SELECT * FROM [tb] GROUP BY [col1] ,[col2] ,[col3] ORDER BY [col1] ,[col2] ,[col3]SELECT * FROM [tb] GROUP BY [col3] ,[col2] ,[col1] ORDER BY [col1] ,[col2] ,[col3]SELECT * FROM [tb] GROUP BY [col2] ,[col3] ,[col1] ORDER BY [col1] ,[col2] ,[col3]/*col1        col2        col3----------- ----------- -----------1           3           52           1           83           2           34           0           NULL(4 行受影响)col1        col2        col3----------- ----------- -----------4           0           NULL3           2           31           3           52           1           8(4 行受影响)col1        col2        col3----------- ----------- -----------4           0           NULL2           1           83           2           31           3           5(4 行受影响)col1        col2        col3----------- ----------- -----------1           3           52           1           83           2           34           0           NULL(4 行受影响)col1        col2        col3----------- ----------- -----------1           3           52           1           83           2           34           0           NULL(4 行受影响)col1        col2        col3----------- ----------- -----------1           3           52           1           83           2           34           0           NULL(4 行受影响)*/ 


[解决办法]
如果不加top的话就是按找上面各位高手说的,order by只影响顺序不影响结果
多个字段的话,和三楼解释一致

热点排行