Выражение не является группировкой по выражению оракула

Обновлено: 21.11.2024

Вы пытались выполнить запрос и получили сообщение об ошибке "ORA-00979: группировка не по выражению"? Узнайте, что это такое и как устранить ошибку в этой статье.

ORA-00979: группа не по выражению

Ошибка ORA-00979 возникает, когда в предложении SELECT есть хотя бы один столбец, которого нет в выражении GROUP BY при использовании агрегатной функции. Общие агрегатные функции включают SUM, AVG, MIN, MAX и COUNT. Любой столбец или выражение в предложении SELECT также должно быть указано в предложении GROUP BY.

Вот пример запроса, который вызовет ошибку:

ORA-00979: не выражение GROUP BY

Почему я получаю сообщение об ошибке ORA-00979?

Эта ошибка возникает из-за того, что вы используете агрегатную функцию, а в предложении SELECT есть хотя бы один столбец, которого нет в предложении GROUP BY.

Используя приведенный выше пример запроса:

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

В этом примере я указал столбцы first_name и last_name в предложении SELECT, но столбца last_name нет в предложении GROUP BY.

Даже если у меня есть некоторые поля в предложении GROUP BY, если я не укажу все поля из предложения SELECT, я все равно получу сообщение об ошибке.

ORA-00979: не выражение GROUP BY

Как видите, это все равно выдаст мне ошибку.

Почему Oracle выдает ошибку?

Потому что, если у вас нет GROUP BY, но вы хотите выбрать столбец SELECT, Oracle не знает, какое значение отображать при использовании этой агрегатной функции. Должен ли он показывать первое значение? Последнее значение? Случайное значение?

Как устранить ошибку ORA-00979

Чтобы устранить ошибку ORA-00979: не группировать по выражению, просто убедитесь, что все столбцы GROUP BY соответствуют предложению SELECT.

Это можно сделать, добавив столбцы в GROUP BY.

Итак, используя приведенный выше пример:

< td data-sheets-value="<"1":2,"2":"Ford">">Ford
">FIRST_NAME ">LAST_NAME ">COUNT(*)
">Джон ">Смит ">2
">Марка ">Андерсон ">1
">Майкл ">Кондор ">1
">Брендан ">Джефферсон ">1
"> Питер ">Старк ">1
">Салли< /td> ">Линкольн ">1
">Мишель ">Brumby ">1
">Эми ">1
">Роза ">Минсон ">1
">Tina ">Митчелл "> 1

Или, используя второй пример:

">FIRST_NAME ">LAST_NAME ">ADDRESS_STATE ">COUNT(*)
">Джон ">Смит ">Калифорния ">1
">Mark ">Андерсон ">Техас ">1
">Майкл ">Кондор ">Флорида ">1
"> Брендан ">Джефферсон ">Флорида ">1
">Питер ">Старк ">Иллинойс ">1
">Салли ">Линкольн ">Калифорния ">1
">Мишель ">Брамби ">Техас ">1
">Эми ">Ford ">Техас ">1
">Роза ">Минсон ">Калифорния ">1
">Тина ">Митчелл ">Иллинойс ">1
">Джон ">Смит ">Техас ">1

Столбцы не обязательно должны быть в одном и том же порядке, чтобы исправить ошибку. Они просто должны присутствовать.

При использовании предложения GROUP BY следует помнить одну вещь: если вы даете своим столбцам псевдонимы, вам нужно указать исходный столбец или выражение.

Итак, если у вас есть такой запрос:

ORA-00904: «FULL_NAME»: неверный идентификатор

Вы получаете сообщение об ошибке, поскольку не можете ссылаться на псевдоним столбца в предложении GROUP BY. Вам нужно будет использовать такой запрос:

< /tr> < tr>

Заключение

Итак, в заключение, ошибка ORA-00979: не группа по выражению возникает из-за того, что столбцы в предложении SELECT не соответствуют столбцам в предложении GROUP BY. Чтобы устранить ошибку, убедитесь, что столбцы совпадают.

Наконец, если вам понравилась информация и советы по карьере, которые я предоставляю, подпишитесь на мою рассылку ниже, чтобы быть в курсе моих статей. Вы также получите фантастический бонус. Спасибо!

3 мысли о «Как разрешить ORA-00979, а не выражение GROUP BY»

Как я могу использовать команду SUM, чтобы получить промежуточный итог для project_price с помощью этого запроса, который я написал.

выберите
a.activity_description,
a.resource_id в качестве resource_id,
b.resource_group_desc,
a.qty_used в качестве qty_used,
a.qty_planned в качестве qty_planned,
a.project_cost,
a.percent_used
из IFSAPP.activity_resource_proj a ПРИСОЕДИНЯЙТЕСЬ к IFSAPP.activity_resource_proj_sum b
ON a.resource_id = b.resource_id
И a.project_id = '&Project_ID'
ЗАКАЗАТЬ ПО Activity_description

Здравствуйте, Олусегун! Вы можете использовать подобный запрос. Вы можете добавить функцию SUM с project_price и GROUP BY для всех остальных полей. Я предполагаю, что цена вашего проекта указана в таблице «a»:
SELECT
a.activity_description,
a.resource_id as resource_id,
b.resource_group_desc,
a.qty_used как qty_used,
a.qty_planned как qty_planned,
a.project_cost,
a.percent_used,
SUM(a.project_price) AS project_price_total
ИЗ IFSAPP.activity_resource_proj a ПРИСОЕДИНЯЙТЕСЬ К IFSAPP.activity_resource_proj_sum b
ON a.resource_id = b.resource_id
И a.project_id = '&Project_ID'
ГРУППИРУЙТЕ ПО
a.activity_description,
a.resource_id
b.resource_group_desc,
a.qty_used
a.qty_planned
a.project_cost,
a.percent_used
ORDER BY activity_description;

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

выберите a.request_no, a.order_state, a.summary, a.impact, a.priority, a.reported_date RIR_crt_date, a.reported_user SIR_NO, a.contact_person_city, a.contact_person_postcode, a.contact_person_house_number, a.xdf_service_instance_id, a.service_id,a.wso_id,a.carrier_type,
b.field_value ANALYSIS_CODE, max(b.seq)
,(выберите max(field_value) из OF_TRACE_DETAILS, где a.request_no=request_no и field_code=' ANALYSIS_CODE_DESCRIPTION') ANALYSIS_CODE_DESCRIPTION
,(выберите max(field_value) из OF_TRACE_DETAILS, где a.request_no=request_no и field_code='CLIENT_TICKET_ID') CLIENT_TICKET_ID
,(выберите max(field_value) из OF_TRACE_DETAILS, где a.request_no=request_no и field_code='BOL_CODE') BOL_CODE
,(выберите max(field_value) из OF_TRACE_DETAILS, где .request_no=request_no и field_code='CARRIER_TECHNOLOGY_TYPE') CARRIER_TECHNOLOGY_TYPE
,(выберите max(field_value) из OF_TRACE_DETAILS, где a.request_no=request_no и field_code='CFS_NAME') CFS_NAME
,(выберите max(field_value) из OF_TRACE_DETAILS, где a.request_no=request_no и field_code='INTERFACE_PROBABLE_CAUSE_CODE') PROBABLE_CAUSE_CODE
,(выберите max(field_value) из OF_TRACE_DETAILS, где a.request_no=request_no и field_code='SYMPTOM_CODE') SYMPTOM_CODE
,(выберите max (field_value) из OF_TRACE_DETAILS, где a.request_no=request_no и field_code='SYMPTOM_CODE_DESCRIPTION') SYM_CODE_DESC
,(выберите max(field_value) из OF_TRACE_DETAILS, где a.request_no=request_no и field_code='INTERFACE_PROBABLE_CAUSE_CODE_DESCRIPTION') ,(выберите max(field_value) из OF_TRACE_DETAILS, где a.request_no=request_no a nd field_code='RESOLUTION_GROUP') RESOLUTION_GROUP
,(выберите max(field_value) из OF_TRACE_DETAILS, где .request_no=номер_запроса и field_code='ИСТОЧНИК') ИСТОЧНИК
,(выберите max(значение_поля) из OF_TRACE_DETAILS, где a.request_no=request_no и workorder_type='LOTTE') LOTTE_TASK
,(выберите workorder_no из of_work_order, где a.request_no=request_no и workorder_type='VWT') VWT_TASK
,(выберите workorder_no из of_work_order, где a. request_no=request_no и workorder_type='REGGEFIBER') REGGEFIBER
из OF_REQUEST a ,OF_TRACE_DETAILS b
где a.state='A'
и a.request_no=b.request_no
и b.field_code='ANALYSIS_DESCRIPTION'
и b.state='A'
и a.request_no='RIR20 2104126058′
группировать по b.field_value;

Оставить комментарий Отменить ответ

Этот сайт использует Akismet для уменьшения количества спама. Узнайте, как обрабатываются данные ваших комментариев.

Являетесь ли вы опытным пользователем SQL или только начинаете, ваши запросы SQL могут возвращать ошибки. Предполагается, что сопровождающие сообщения помогут вам их исправить; однако иногда сообщения не очень полезны. Сообщение Oracle «Не выражение GROUP BY» является одним из таких примеров. Давайте рассмотрим, что это такое и как это исправить.

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

Если вы знакомы с GROUP BY , вам следует помнить следующее общее правило: каждый столбец в операторе SELECT должен либо вызываться в агрегатной функции, либо находиться в предложении GROUP BY.

ORA-00979 «Не выражение GROUP BY» — это ошибка, выдаваемая базой данных Oracle, когда оператор SELECT содержит столбец, который не указан в GROUP BY и не агрегирован. Это сообщение об ошибке может сбить с толку новичков.

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

Предположим, нам нужно узнать дату последней покупки и среднюю сумму покупки на одного клиента по штатам. Мы используем следующий запрос:

Если вы попытаетесь выполнить этот запрос, база данных Oracle выдаст следующее сообщение об ошибке:

ORA-00979: не выражение GROUP BY

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

  • PostgreSQL. ОШИБКА: столбец "customers.city" должен присутствовать в предложении GROUP BY или использоваться в агрегатной функции.
  • SQL-сервер. Столбец "customers.city" недействителен в списке выбора, так как он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

Итак, что не так с нашим запросом?

Почему база данных Oracle сообщает об этой ошибке?

В приведенном выше запросе мы просим базу данных показать следующую информацию о клиентах:

  • состояние,
  • город,
  • дата последней покупки и
  • общая сумма покупки.

Из этих четырех столбцов столбец состояния отображается в предложении GROUP BY, а столбцы last_purchase_date и Purchases объединяются с помощью функций MAX() и AVG() соответственно. Столбец city не вызывается агрегатной функцией и не указан в GROUP BY . Однако у нас есть два города в штате Калифорния («Калифорния») и два города в штате Нью-Йорк («Нью-Йорк»). База данных просто не знает, какое значение отображать.

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

Как исправить ошибку «Выражение не GROUP BY»

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

Вариант 1. Добавьте столбец города в GROUP BY . Если вы хотите, чтобы город отображался в выходных данных, вам нужно сгруппировать данные как по штату, так и по городу .

Вот результат, который вы получите при группировке по штатам и городам:

">FULL_NAME ">COUNT(* )
" data-sheets-formula="=R[0] C[-2]&" "&R[0]C[-1]">Джон Смит ">2
" data-sheets-formula="=R[0]C [-2]&" "&R[0]C[-1]">Марк Андерсон ">1< /td>
" data-sheets-formula="=R[0]C[ -2]&" "&R[0]C[-1]">Майкл Кондор ">1
" data-sheets-formula="=R[0]C[- 2]&" "&R[0]C[-1]">Брендан Джефферсон ">1
" data-sheets-formula="=R[0]C[-2 ] &" "&R[0]C[-1]">Питер Старк ">1
" data-sheets-formula="=R[0]C[-2]& " "&R[0]C[-1]">Салли Линкольн ">1
" data-sheets-formula="=R[0]C[-2]&" "&R[0]C[-1]">Мишель Брамби ">1
" data-sheets-formula="=R[0]C[-2]&" " &R[0]C[-1]">Эми Форд ">1
" data-sheets-formula="=R[0]C[-2]&" "&R [0]C[-1]">Роуз Минсон ">1
" data-sheets-formula="=R[0]C[-2]&" "&R[ 0]C[-1]">Тина Митчелл ">1
штатгородпоследняя_покупкасреднее_покупка
Нью-ЙоркБаффало2020-05-25435.00
КалифорнияСан-Франциско2020-09-09115,33
CAЛос-Анджелес2020-03-23548.00
NY< /td>Нью-Йорк2020-10-021287,75

Вариант 2. Удалите столбец города из SELECT . Если вы хотите, чтобы ваши выходные данные были сгруппированы только по штатам, вам нужно удалить город из оператора SELECT. Как я показал выше, просто невозможно отобразить город, когда строки сгруппированы только по штатам.

Результат будет следующим:

< td>2020-10-02
состояниепоследняя_покупкасреднее_покупка
CA2020-09-09288.40
NY1003.50

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

В нашем примере мы можем отображать количество уникальных городов с клиентами в каждом штате:

Вот что вы получите, выполнив этот запрос:

Ознакомьтесь с этой статьей для получения дополнительных примеров GROUP BY .

Исправьте ошибку «Не GROUP BY Expression» и попрактикуйтесь в GROUP BY!

  • Основы SQL – это вводный курс по SQL, который охватывает все основные темы, включая группировку и агрегирование данных в SQL.
  • Практический набор по SQL – это набор из более чем 80 упражнений по SQL, которые помогут вам попрактиковаться в группировании и не только в SQL.
  • В разделе «Создание базовых отчетов SQL» основное внимание уделяется деталям GROUP BY, которые не рассматриваются в курсе «Основы SQL». Здесь вы узнаете о некоторых распространенных ошибках с GROUP BY и увидите, как он используется в реальных отчетах.

Наконец, теперь, когда вы прочно усвоили ключевое правило предложения GROUP BY, а именно, что все неагрегированные столбцы из оператора SELECT должны быть в GROUP BY, оказывается, что это не всегда так! Заинтригован? Прочтите эту статью, чтобы узнать больше.

ORA-00979

ORA-00979 относится к предложению GROUP BY. Когда пользователь сталкивается с этой ошибкой, отображается следующее сообщение:

ORA-00979: не выражение GROUP BY

По сравнению с другими ошибками Oracle, ошибка ORA-00979 обычно проста и может быть легко устранена одним из трех способов.

Проблема

ORA-00979 возникает, когда предложение GROUP BY не содержит всех выражений в предложении SELECT. Любое выражение SELECT, не включенное в функцию GROUP, должно быть указано в предложении GROUP BY. Это AVG, COUNT, MAX, MIN, SUM, STDDEV и VARIANCE. Возможно, вы также пытались выполнить инструкцию SELECT, содержащую предложение GROUP BY.

Решение

Чтобы исправить эту ошибку, включите все выражения SELECT в предложение GROUP BY. Убедитесь, что выражения не являются аргументами групповой функции. Существует три метода устранения этой ошибки.

  • Перепишите оператор SELECT так, чтобы выражение или столбец, перечисленные в списке SELECT, также находились в предложении GROUP BY.
  • Вы можете полностью удалить функцию GROUP BY из инструкции SELECT.
  • Удалите все выражения, не входящие в предложение GROUP BY, из списка SELECT.

Первый вариант исправления ошибки применим к следующему примеру, в котором пользователь пытается выполнить оператор SELECT:

ВЫБЕРИТЕ отдел, класс, MAX(число) AS «Наибольшее количество учащихся»

ГРУППИРОВАТЬ ПО ОТДЕЛАМ;

В этом примере ошибку можно исправить, включив класс в предложение GROUP BY.Класс включается как в операторы SELECT, так и в операторы GROUP BY.

ВЫБЕРИТЕ отдел, класс, MAX(число) AS «Наибольшее количество учащихся»

ГРУППИРОВАТЬ ПО отделам, классам;

Заглядывая вперед

Чтобы избежать появления ORA-00979, убедитесь, что выражения в списке SELECT также включены в предложение GROUP BY. Если выражение также находится в предложении GROUP BY, вы не должны увидеть ошибку. Если вы продолжаете видеть ошибку и не можете решить проблему, обратитесь к администратору базы данных. Вы также можете обратиться к лицензированному консультанту Oracle. Прежде чем использовать их услуги, всегда проверяйте, что у них есть надлежащие учетные данные и уровень опыта, необходимый для удовлетворения ваших потребностей Oracle.

Использование утилиты oerr позволяет получить следующую информацию об ошибке ORA-00979:

ORA-00979 не является выражением GROUP BY.

Причина. Предложение GROUP BY не содержит всех выражений в предложении SELECT. Выражения SELECT, не включенные в групповую функцию, такие как AVG, COUNT, MAX, MIN, SUM, STDDEV или VARIANCE, должны быть указаны в предложении GROUP BY.

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

Ошибка ORA-00979 состоит из двух компонентов:

  1. Вы попытались выполнить инструкцию SELECT, содержащую функцию GROUP BY, такую ​​как MIN, MAX, SUM или COUNT.
  2. Вы попытались выполнить выражение в списке SELECT, которого нет в предложении GROUP BY.

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

Вот три способа устранения ошибки ORA-00979:

  1. Сделайте выражение или столбец, указанный в списке SELECT, также включенным в предложение GROUP BY, полностью переписав оператор SELECT.
  2. Полностью удалите функцию GROUP BY из оператора SELECT, включая MIN, MAX, SUM и/или COUNT.
  3. Если есть выражение, которого нет в предложении GROUP BY, полностью удалите его из списка SELECT.

В подавляющем большинстве ваз ошибка ORA-00979 вызвана тем, что неагрегированный столбец не включен в предложение GROUP BY.

Например, в этом случае возникает ошибка ORA-00979, поскольку третий столбец запроса не включен в GROUP BY:

выбрать
emp_dept,
emp_id,
emp_name,
sum(emp_comissions)
из
my_emp
группировать по
emp_dept,
emp_id;

ORA-00979: не выражение GROUP BY

Бурлесон — американская команда

Примечание. Эта документация по Oracle была создана в качестве справочника по поддержке и обучению Oracle для использования нашими специалистами-консультантами по настройке производительности администраторов баз данных. Не стесняйтесь задавать вопросы на нашем форуме Oracle.

Проверьте опыт! Любой, кто рассматривает возможность использования услуг эксперта службы поддержки Oracle, должен самостоятельно проверить свои полномочия и опыт, а не полагаться на рекламу и самопровозглашенный опыт. Все законные эксперты Oracle публикуют свои квалификации Oracle.

Ошибки? Технология Oracle меняется, и мы стараемся обновлять нашу информацию о поддержке BC Oracle. Если вы обнаружите ошибку или у вас есть предложение по улучшению нашего контента, мы будем признательны за ваш отзыв. Просто электронная почта:

и укажите URL-адрес страницы.


Burleson Consulting

Оракул поддержки баз данных

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

штатcities_with_customersпоследняя_покупкасреднее_покупка
CA22020-09-09288,40
Нью-Йорк22020-10-021003,50