在简单查询中,GROUP BY字段的顺序与最终结果没有区别(忽略开发人员的易读性)。
EG:SELECT COUNT(*) FROM People GROUP BY Age, Gender
将产生与触发GROUP BY字段相同的结果。
一般来说,在什么条件下,GROUP BY字段的这种明显的可交换属性会崩溃?
我在这里寻找一般规则(EG:“任何包含依赖于其中一个分组字段的子表达式的表达式”)
我很难想出一个关于排序重要的例子 - 但我的直觉告诉我它在某些情况下确实如此。
答案 0 :(得分:4)
我认为唯一重要的是使用ROLLUP来创建小计
http://msdn.microsoft.com/en-us/library/ms189305(v=sql.90).aspx
CREATE TABLE #Prod
(
ID INT IDENTITY(1,1),
Cat INT,
Size Int
)
INSERT #Prod SELECT 1,1
INSERT #Prod SELECT 1,1
INSERT #Prod SELECT 1,2
INSERT #Prod SELECT 1,3
INSERT #Prod SELECT 1,3
INSERT #Prod SELECT 1,3
INSERT #Prod SELECT 2,1
INSERT #Prod SELECT 2,2
INSERT #Prod SELECT 2,2
INSERT #Prod SELECT 2,3
INSERT #Prod SELECT 2,3
INSERT #Prod SELECT 2,3
SELECT
COUNT(*)
FROM #Prod
GROUP BY Cat, Size WITH ROLLUP
SELECT
COUNT(*)
FROM #Prod
GROUP BY Size , Cat WITH ROLLUP
2 1 3 6 1 2 3 6 12
(9行受影响)
2 1 3 1 2 3 3 3 6 12
(10行(s)受影响)
答案 1 :(得分:1)
我只是在这里推测,但如果有人实现了基于CLR的聚合函数,则订单可能很重要。我之前在C#中实现了一个聚合函数,我有这种感觉,根据聚合实际上做的事情,组可能会影响它的顺序。
我不太了解聚合CLR函数如何与引擎交互以真正说出更多内容:/
答案 2 :(得分:0)
NEW !!! 所以...在使用分组集时,订单可能很重要;我必须做一些测试。
--- OLD是的ORDER<>组。 鉴于:
Select val, text2 from b
order by text2, val;
结果:
Val text2
4 XXX010103
1 XXX010105
1 something XXX010101 something else XXX010102
2 yet another XXX010102 and this XXX010103
vs:
Select val, text2 from b
order by val,text2;
val text2
1 XXX010105
1 something XXX010101 something else XXX010102
2 yet another XXX010102 and this XXX010103
4 XXX010103
不同的顺序显示不同的排序;但也许问题不是关于顺序而是关于子集:并且命令在不同的子集中也是重要的:
Imagine select top 1 from table order by val vs select top 1 from table order by val desc;
答案 3 :(得分:0)
我喜欢你的问题:)
我认为,在你提到的情况下,你在做计数(纯粹是加法),分组顺序无关紧要。添加是可交换的,GROUP BY不应该从集合中删除任何行,它只是聚合它们以供显示。因此,将它们分组的顺序不应有任何区别。