SQL GROUP BY字段在所有情况下都是可交换的吗?

时间:2011-12-02 18:23:53

标签: sql database

在简单查询中,GROUP BY字段的顺序与最终结果没有区别(忽略开发人员的易读性)。

EG:SELECT COUNT(*) FROM People GROUP BY Age, Gender将产生与触发GROUP BY字段相同的结果。

一般来说,在什么条件下,GROUP BY字段的这种明显的可交换属性会崩溃?

我在这里寻找一般规则(EG:“任何包含依赖于其中一个分组字段的子表达式的表达式”)

我很难想出一个关于排序重要的例子 - 但我的直觉告诉我它在某些情况下确实如此。

4 个答案:

答案 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

查询1的结果

2 1 3 6 1 2 3 6 12

(9行受影响)

查询2的结果

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不应该从集合中删除任何行,它只是聚合它们以供显示。因此,将它们分组的顺序不应有任何区别。