почему не работает какой-то вложенный регистр? - PullRequest
0 голосов
/ 28 февраля 2020

, например: select sum(b),sum(c),sum(sum(b)+sum(c)) from t1 group by a;

в oracle, дает исключение: «ORA-00979: не выражение GROUP BY», указатель на b в сумме (b).

по моему мнению, план:

первый шаг:

select sum(b),sum(c) from t1 group by a; //sub1

второй шаг:

select sum(sum(b)+sum(c)) from sub1;

почему oracle дают исключение?

1 Ответ

1 голос
/ 28 февраля 2020

Вы смешиваете два уровня агрегации.

Первый уровень агрегации - это когда вы "group by a". Если бы вы сделали это один, вы получите одну строку для каждого значения A. sum(b) и sum(c) будут иметь определенные значения c для каждой из этих строк.

Второй уровень агрегации использует результаты первого уровня. Когда вы говорите sum(sum(b)+sum(c)), вы делаете вторую агрегацию результатов первой агрегации. От этой второй агрегации есть только один результат и только одна строка.

Поскольку в конечном выводе имеется только одна строка, где могут быть кратны значения sum(b) go?

Может быть, вы думаете, что sum(b) само по себе должно быть суммой всех B в каждом ряду T1? Синтаксис работает не так. sum(b) говорит одна агрегация, а не две, поэтому она всегда будет непосредственным результатом операции group by.

То, что будет работать, это select sum(sum(b)),sum(sum(c)),sum(sum(b)+sum(c)) from t1 group by a;. Теперь вы делаете два уровня агрегации везде.

...