Являются ли поля SQL GROUP BY коммутативными во всех случаях?

В простом запросе порядок полей GROUP BY не имеет значения (игнорируя разборчивость разработчика) до конечного результата.

EG: SELECT COUNT(*) FROM People GROUP BY Age, Gender выдаст те же результаты, что и поля GROUP BY.

Вообще говоря, при каких условиях (s) это кажущееся коммутативное свойство полей GROUP BY ломается?

Я ищу здесь общее правило (EG: "Любое выражение, содержащее подвыражения, зависящие от одного из сгруппированных полей" )

Мне нелегко придумать пример того, где будет иметь дело заказ, но моя кишка говорит мне, что это происходит в некоторых ситуациях.

Ответ 1

Я думаю, что единственный раз, когда это имеет значение, это использование 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 строк)

Ответ 2

Я только размышляю здесь, но возможно, что если кто-то реализует агрегированные функции на основе CLR, это будет иметь значение. Я реализовал агрегированную функцию раньше в С#, и у меня есть это ощущение, что в зависимости от того, что происходит на самом деле, возможно, что порядок группы может повлиять на нее.

Я не знаю достаточно о том, как агрегированные функции CLR взаимодействуют с движком, чтобы действительно сказать что-то большее:/

Ответ 3

NEW!!! Итак... это возможно при использовании наборов группировок, порядок может иметь значение; я должен был бы провести некоторое тестирование.

--- OLD yeah ORDER < > Group. Учитывая:

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;

Ответ 4

Мне нравится ваш вопрос:)

Я думаю, что в случае, когда вы указываете, где вы делаете подсчеты (что является чисто аддитивным), порядок группировки не имеет значения. Добавление является коммутативным, и GROUP BY не должно удалять любые строки из набора, он просто сводит их к отображению. Поэтому не должно быть никакого значения, какой порядок вы их группируете.