Выражение не является выражением group by oracle

Обновлено: 07.07.2024

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

Вы должны поместить все столбцы SELECT в GROUP BY или использовать на них функции, которые сжимают результаты до одного значения (например, MIN , MAX или SUM ).

Простой пример, чтобы понять, почему это происходит: представьте, что у вас есть такая база данных:

и вы запустите SELECT * FROM table GROUP BY foo . Это означает, что база данных должна возвращать одну строку в качестве результата с первым столбцом 0 для выполнения GROUP BY , но теперь есть два значения bar . Какой результат вы ожидаете - A или B ? Или должна ли база данных возвращать более одной строки, нарушая контракт GROUP BY ?

Включить в предложение GROUP BY все выражения SELECT , которые не являются аргументами групповой функции.

Слишком плохо Oracle имеет такие ограничения. Конечно, результат для столбца, не входящего в GROUP BY, будет случайным, но иногда вы этого хотите. Глупый Oracle, вы можете сделать это в MySQL/MSSQL.

, но для Oracle есть работа:

Пока следующая строка не работает

Вы можете обмануть Oracle с некоторым числом 0, как показано ниже, чтобы сохранить свой столбец в области видимости, но не группировать его (предполагая, что это числа, в противном случае используйте CONCAT)

Группа by используется для агрегирования некоторых данных, в зависимости от агрегатной функции, и кроме нее вам нужно поместить столбец или столбцы, которым нужна группировка.

select d.deptno, max(e.sal) from emp e, dept d where e.deptno = d.deptno group by d.deptno;

Это приведет к максимальной заработной плате отделов.

Теперь, если мы опустим предложение d.deptno из group by, оно даст ту же ошибку.

Вы должны сделать следующее:

Такая же ошибка возникает, когда ключевое слово ВЕРХНИЕ или НИЖНИЕ не используется в обоих местах в выражении выбора и группе по выражению.

Неверно: -

Вправо: -

Если вы выполняете поиск в соответствии с предложением GROUP BY , любое выражение в SELECT , которое не является групповой функцией (или агрегатной функцией или агрегированной колонкой), например COUNT , AVG , MIN , MAX , SUM и т.д. (Список функций агрегации) должны присутствовать в GROUP BY .

Пример (правильный путь) (здесь employee_id не является групповой функцией (неагрегированный столбец), поэтому он должен отображаться в GROUP BY . Напротив, сумма (зарплата) представляет собой группу (агрегированный столбец), поэтому не требуется появляться в предложении GROUP BY .

Пример (неправильный путь) (здесь employee_id не является групповой функцией и не появляется в предложении GROUP BY , что приведет к ошибке ORA-00979.

EDIT: Функция MAX в столбце Date не работает, потому что этот столбец varchar(200) структура базы данных/таблиц не моя, и я не могу ее изменить.

Я пытаюсь показать все различные компании, в которых работают студенты. Однако должны быть показаны только компании, в которых работает более четырех студентов. Это то, что у меня есть до сих пор: SELECT EMPLOYER, COUNT (STUDENT_ID) FROM STUDENT GROUP BY STUDENT_ID HAVING COUNT (STUDENT_ID) >4;.

Я пытаюсь понять GROUP BY (новый для СУБД oracle) без агрегатной функции. Как он работает? Вот что я попробовал сделать. EMP таблица, на которой я буду запускать свой SQL. SELECT ename , sal FROM emp GROUP BY ename , sal SELECT ename , sal FROM emp GROUP BY ename; Результат ORA-00979: не a GROUP.

Вам нужно сделать одну из двух вещей.

  • GROUP BY и использовать агрегатные функции для объединения нескольких записей в одну
  • Используйте некоторый поиск, чтобы определить одну запись, которую вы хотите получить из группы

В вашем случае вам не просто нужен MAX() из таблицы 1, так как вполне возможно , что более высокий id имеет более низкий date . В этом случае я был бы склонен использовать систему поиска.

NOTE: Предполагается, что ваша дата отформатирована таким образом, чтобы буквенно-цифровой порядок WILL давал правильный порядок дат. Если это NOT (и d-m-yyyy не будет правильно заказан), вам нужно заменить date_field на TO_DATE(date_field) , чтобы обеспечить правильный порядок.

NOTE: Использование TO_DATE(date_field) также, вероятно, исправит ваши проблемы MAX().

NOTE: Если вы хотите хранить даты в виде строк, но чтобы они были удобными для заказа, используйте yyyy-mm-dd

Попробуйте сделать это следующим образом:

В предложении select и order by оператора SQL с group by вы можете использовать только столбцы/выражения, используемые в group by или агрегатных функциях (min, max, avg ..) других столбцов.

Я знаю это для oracle, и я немного удивлен, что это отличается в MySQL

Group by в oracle означает, что вы пытаетесь запустить агрегатную функцию (sum, count и т. Д.) В одном из столбцов. Похоже, что вы просто хотите заказать сначала ID, а затем дату. Я бы сделал что-то вроде этого:

Если это не то, что вы намереваетесь, то ответ заключается в том, что вам нужно, чтобы каждый столбец в предложении select, который не является частью агрегатной функции, был в предложении group.

В ответ на комментарий:

Вероятно, лучше всего сначала отфильтровать таблицу 1 в качестве подзапроса, а затем присоединиться к таблице 2:

В общем, говорить select * from в сочетании с group by -плохая идея. Выражения в предложении select должны быть scalar, то есть либо агрегатными функциями группы, либо не связанными с группировкой, либо в самом предложении group by. Select * в значительной степени гарантирует, что этого не произойдет. Вы, вероятно, хотите что-то подобное вместо этого:

create view top5food as select f.FoodID,f.FoodName,SUM(o.Quantity) as Total Food Sold from FOODANDBEVERAGEORDER o,FOODANDBEVERAGE f where o.foodid=f.foodid group by o.foodid order by SUM(o.Quantity) desc; что-нибудь не так с этим запросом? существует ошибка ORA-00979, а не выражение GROUP BY

Получение ошибки ORA-00979: не выражение GROUP BY. Я не знаю, почему это происходит. Все кажется правильным. Неужели я упускаю здесь что-то вопиюще очевидное? SELECT to_number(CALOT_AWD_YR), CALOT_TPC, ATCAT_ALLOT_NBR, ATCAT_TCAT, SUM(CALOT_AMT_FUNDED), ATCAT_C_OR_D_IND FROM.

Похожие вопросы:

У меня есть следующий код, который вызывает исключение Ора-00979: не выражение group by. Даже если я удалю предложение group by , оно все равно даст ошибку ORA-00937: не одногруппная групповая.

Я относительно новичок в базах данных. Я использую Oracle и пытаюсь реализовать этот запрос, чтобы найти количество персональных тренировок, проведенных участником. Столы стоят; MEMBERS.

У меня есть приложение, которое использует Hibernate. Он сгенерировал следующее утверждение SQL. Я пытаюсь изменить запрос, чтобы сгруппировать данные, но я продолжаю получать ошибку ORA-00979: not.

Я пытаюсь показать все различные компании, в которых работают студенты. Однако должны быть показаны только компании, в которых работает более четырех студентов. Это то, что у меня есть до сих пор.

Я пытаюсь понять GROUP BY (новый для СУБД oracle) без агрегатной функции. Как он работает? Вот что я попробовал сделать. EMP таблица, на которой я буду запускать свой SQL. SELECT ename , sal FROM.

create view top5food as select f.FoodID,f.FoodName,SUM(o.Quantity) as Total Food Sold from FOODANDBEVERAGEORDER o,FOODANDBEVERAGE f where o.foodid=f.foodid group by o.foodid order by SUM(o.Quantity).

Получение ошибки ORA-00979: не выражение GROUP BY. Я не знаю, почему это происходит. Все кажется правильным. Неужели я упускаю здесь что-то вопиюще очевидное? SELECT to_number(CALOT_AWD_YR).

Я попытался получить некоторые результаты из запроса в моих таблицах Oracle. Цель состоит в том, чтобы получить общую сумму призовых денег, выигранных всеми участниками, которые принадлежат к 3.

Я пытаюсь запустить следующий код: SELECT BOOK.BOOK_NUM AS Book Number, BOOK.BOOK_TITLE AS Book Title, BOOK.BOOK_SUBJECT AS BOOK SUBJECT, ROUND(AVG(BOOK.BOOK_COST),2) as Subject Avg, (BOOK_COST -.

что не так с этим утверждением sql, я продолжаю получать эту ошибку: SQL ошибка: ORA-00979: не GROUP BY выражение 00979. 00000 - not a GROUP BY expression *Cause: *Action: SELECT.

Репутация: нет
Всего: 3

Добрый вечер всем! Имееется вот такой запрос:

Что я не так делаю ?

Репутация: 4
Всего: 8

1. что то непонятное накрутили после from
2. При группировке обязательно нужно указывать все поля
3.
Цитата
один отчет может уйти на нескольких адресатов, тем самым я пытаюсь сделать Group by по id отчета, что бы каждый отправленные отчет стал уникальным

ну и sql должен приобрести приблизительно такой вид:

Репутация: нет
Всего: 3

Если будет такая ситуация:

если тут группировать по ID, какой будет результат ?

Репутация: 4
Всего: 8

Цитата

если тут группировать по ID, какой будет результат ?

только по одному полю ID группировать нельзя, если вы группируете, то группировку нужно проходит ПО ВСЕМ ВЫВОДИМЫМ полям, кроме расчетных (SUM,COUNT,MAX. )
почитайте про "Аналитические функции "в ORACLE

Репутация: нет
Всего: 3

Понятно, спасибо большое за объяснение ) я просто не правильно понимал как работает group by.

А не подскажите, group by так работает во всех СУБД ? или только в Oracle ?

Репутация: 4
Всего: 8

Цитата

group by так работает во всех СУБД ? или только в Oracle ?

Исключения я встречал только MySQL и в DBASE при работе через FOXPRO - там можно группировать по нескольким полям.

Репутация: 37
Всего: 161

Здесь тоже можно группировать по нескольким полям.
Наверное ты не правильно выразился.

На счет FoxPro не знаю, но MySQL действительно допускает использовать в списке выводимых полей (select-list) не перечисленные в выражении group by поля без использования аггрегатов. Что, с моей точки зрения, слишком часто сбивает с толку новичков, мешает им понять суть происходящего и провоцирует их допускать ошибки.


Для того, чтобы правильно реализовать это условие, надо определиться по какому принципу дожны формироватся дополнительные аттрибуты выборки.
Например в вашем случае:

какой дескрипшн из двух указанных, должен оказаться результирующей выборке, если значение ID станет там уникальным?

На этом примере прекрасно видно благо, которое несет наличие ограничения, наложенного ораклом. Начинающий MySQLщик не стал бы париться этим вопросом и получил бы недетерменированный результат, который сегодня, на тестовой среде, казалось бы, стабильно возвращает descr1, а завтра, при переносе окружение заказчика, необъяснимо, станет возвращать descr2.

Достоверно известно, что 89% людей доверяют статистике взятой с потолка

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

[ Время генерации скрипта: 0.1185 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Обычно в список возвращаемых столбцов запросов с группировкой входят столбец группировки и агрегатная функция. Если не указать агрегат, то можно просто обойтись выражением DISTINCT без использования предложения GROUP BY! А так же, если в запрос не включить столбец группировки, вы не сможете определить, к какой именно группе относится та или иная строка результата запроса! Так же в SQL92 игнорируется информация о первичных и вторичных ключах, при анализе запроса с группировкой.

Вот, например: Подсчитать общее количество заказов для каждого служащего. Уууупс! А вот и ошибочка!

В данном случае имеется в виду поле NAME. Так как оно явно не вписывается в запросе! Хотя, если рассуждать с точки зрения природы данных, все вроде бы правильно, но не совсем. Столбец EMPL_NUM является первичным ключом таблицы SALESREPS, поэтому столбец NAME должен иметь одно значение для каждой группы! Правильно, просто нужно указать этот столбец в выражении группировки вот так: Подсчитать общее количество заказов для каждого служащего.

Вот теперь правильно! :)

А можно сделать еще проще. Вот так: Подсчитать общее количество заказов для каждого служащего.

Теперь надеюсь, все стало ясно с группировками, если что не понятно можете писать письма! :) А вот теперь давайте вернемся к нашему старому знакомому - ну, конечно же, NULL. Что будет, если в одном из полей группировки будет присутствовать NULL? К какой группе его отнести? В предложении WHERE по правилам сравнение NULL и NULL скажем на равенство не дает TRUE, а будет равно NULL! В предложении GROUP BY это крайне не удобно, так как каждый NULL будет генерировать новую группу. Поэтому в стандарте ANSI/ISO определено, что в предложении GROUP BY значения NULL РАВНЫ. Следовательно, он не будут вносить неразбериху в запросах с группировкой! Что, собственно и требовалось в данном случае. Для примера создадим табличку COLORIS и проверим наши рассуждения.

Табличка создана! Не забудьте дать оператор COMMIT вот так:

Если все верно, то получите следующее:

Теперь операцией копирования через буфер обмена отправьте в SQLPlus следующее:

Если все успешно прошло получите примерно следующее:

Табличка заполнена данными! Как мы это проделали, напомню, применив оператор INSERT. Он отправляет данные в таблицы БД. О нем мы еще поговорим в дальнейшем. А вот теперь давайте наконец дадим запрос и проверим теорию равенства NULL в выражениях GROUP BY:

Хорошо видно, как NULL сформировал собственную группу! Вот теперь кажется разобрались в особенностях работы агрегатов со значениями NULL в БД Oracle. :)

Читайте также: