Так в чём же причина ошибки (или заблуждение автора вопроса).
Оператор суммирования +
выполнется для значений колонок или выражений полученных из одной записи (по горизонтали). Групповая функция SUM()
выполнется для значений колонок или выражений всех записей группы (по вертикали), а группа без клаузы GROUP BY
это всегда все записи полученные после условия фильтрации в WHERE
.
То есть, на таких тестовых данных, после простейшего запроса:
create table t (id, fname, lname) as
select 1, 'aaa', 'bbb' from dual union all
select 2, 'cc', 'dd' from dual
/
select sum (length (fname) + length (lname))
from t
автор вопроса ожидал бы получить две записи со значениями 6 и 4, однако результат:
SUM
----------
10
Но интересен же результат для каждой записи со своим ID
(или другими столбцами):
select id, sum (length (fname) + length (lname)) sumlen
from t
ORA-00937: not a single-group group function
В этом случае БД должна вывести все ID
, то есть, так получится несколько групп записей.
Об этом и говорится в сообщении об ошибке — групповая функция может посчитать значения только одной группы, но никак не нескольких.
Решение очевидно — групповая функция SUM
в запросе явно лишняя:
select *
from t
order by (length (fname) + length (lname));
ID FNA LNA
---------- --- ---
2 cc dd
1 aaa bbb
As Rene said, you can’t select columns which aren’t in the group by clause.
If you want to select these columns but only for studentid
s that have count(*) = 2
for some critria you can do it like this:
select *
from
(SELECT e.*, count(*) over (partition by e.studentid) cnt
FROM enrolled e
FULL OUTER JOIN student s ON e.studentid = s.sid
WHERE ((e.quarter = 'Fall') OR (e.quarter = 'Spring'))
)
where cnt = 2
Or
SELECT e.*, count(*) over (partition by e.studentid) cnt
FROM enrolled e
FULL OUTER JOIN student s ON e.studentid = s.sid
WHERE ((e.quarter = 'Fall') OR (e.quarter = 'Spring'))
AND (select count(*) from enrolled i where i.studentid = e.studentid) = 2
Anyway, you can’t do ==
only =
poplan 1 / 1 / 0 Регистрация: 26.11.2017 Сообщений: 166 |
||||
1 |
||||
24.04.2019, 10:08. Показов 6604. Ответов 9 Метки нет (Все метки)
В чем проблема?
0 |
Zero day 267 / 231 / 78 Регистрация: 16.12.2015 Сообщений: 943 Записей в блоге: 4 |
|
24.04.2019, 10:35 |
2 |
poplan, а условие группировки то где (раз есть в блоке select count-функция)? Которое group by column_name_1, column_name_2…
1 |
Модератор 4206 / 3046 / 581 Регистрация: 21.01.2011 Сообщений: 13,190 |
|
24.04.2019, 11:07 |
3 |
В чем проблема? Запрос выглядит довольно страшненько. Почему бы все JOIN не делать в основном запросе, а в COUNT анализировать только срок реализации?
0 |
poplan 1 / 1 / 0 Регистрация: 26.11.2017 Сообщений: 166 |
||||
24.04.2019, 12:02 [ТС] |
4 |
|||
count оказался ненужным, но теперь другой вопрос.
0 |
Модератор 4206 / 3046 / 581 Регистрация: 21.01.2011 Сообщений: 13,190 |
|
24.04.2019, 13:50 |
5 |
(SELECT P.OSTATOK_TOVARA FROM POSTAVKI P INNER JOIN TOVARI T ON P.TOVAR_ID = T.TOVAR_ID, KATEGORIYA_TOVARA K INNER JOIN TOVARI T ON K.KATEGORIYA = T.KATEGORIYA WHERE K.SROK_REALIZACII > SYSDATE) AS Neist, В общем случае твоя конструкция работать не будет, поскольку скалярный подзапрос (а именно так называется примененная тобой конструкция) должен возвращать всего одно значение, а такой запрос, как у тебя опять же в общем случае вернет много значений.
0 |
1 / 1 / 0 Регистрация: 26.11.2017 Сообщений: 166 |
|
24.04.2019, 14:21 [ТС] |
6 |
Ну да, так и есть, но я что-то не могу придумать как реализовать нормально
0 |
Zero day 267 / 231 / 78 Регистрация: 16.12.2015 Сообщений: 943 Записей в блоге: 4 |
|
24.04.2019, 14:51 |
7 |
poplan, тогда 100% вариант: привести таблицы + связи и точную формулировку задачи.
0 |
1 / 1 / 0 Регистрация: 26.11.2017 Сообщений: 166 |
|
24.04.2019, 14:56 [ТС] |
8 |
Запрос: товар – общий остаток – остаток с неистёкшим сроком реализации – остаток с истёкшим сроком реализации. Сами таблицы:
0 |
orion2014 93 / 71 / 33 Регистрация: 02.08.2015 Сообщений: 202 |
||||||||
25.04.2019, 11:04 |
9 |
|||||||
Сообщение было отмечено poplan как решение РешениеЗдравствуйте! Я думаю, что Вы не совсем правильно поняли задачу. Как-то так это должно быть исходя из указанной вами схемы. Возможное решение задачи может быть таким:
Сам запрос:
1 |
1 / 1 / 0 Регистрация: 26.11.2017 Сообщений: 166 |
|
25.04.2019, 14:25 [ТС] |
10 |
Ну да, нужно было через сколько часов нужно реализовать товар, а у меня просто до какой даты Добавлено через 21 минуту
0 |
Ошибка: ORA-00937: не групповая групповая функция
Может кто-нибудь сказать, почему это происходит?
3 ответа
4 Решение Ben [2012-07-05 21:10:00]
Возможно, вы установили его с помощью max , но это не то, почему это происходит, и немного взломано. Ваша проблема заключается в том, что ваш подзапрос, который переводится в один столбец, не является агрегированным запросом, min , max , sum и т.д. И поэтому должен быть включен в предложение group by . Вы исправили это, обернув его в max , поскольку максимум одного значения всегда будет постоянным.
Однако, поскольку ваш подзапрос сам по себе является аналитическим запросом и только когда-либо вернет одну строку, очевидная вещь, которую нужно сделать, это использовать декартовое соединение, чтобы добавить его в ваш запрос. В явном синтаксисе соединения это называется cross join .
Декартовое соединение имеет плохую репутацию, поскольку оно умножает количество строк на одной стороне соединения на количество строк на другом. Однако он использует его, особенно в этом случае.
1 DCookie [2012-07-05 21:10:00]
Это происходит потому, что сам подзапрос является скалярным результатом, а не групповой функцией. Как вы, по-видимому, обнаружили, вы можете исправить это, заменив групповую функцию, которая дает эквивалентный результат вашему подзапросу.
В слиянии, если вы получаете эту ошибку, чем просто используйте группу, и она решит проблему.
У меня есть задание: Выбрать сотрудников у которых фамилия или имя короче 5 символов. Упорядочить записи по суммарной длине фамилии и имени, затем по длине фамилии, затем просто по фамилии, затем просто по имени.
Я пишу следующий запрос:
И у меня возникает следующая ошибка: ORA-00937: групповая функция не является одногруппной. Помогите пожалуйста разобраться с проблемой.
1 ответ 1
нужно было убрать SUM и всё получилось
Всё ещё ищете ответ? Посмотрите другие вопросы с метками sql oracle или задайте свой вопрос.
Похожие
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2020 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2020.1.16.35797
Любой столбец или выражение в списке SELECT , который не является агрегатной функцией, должен быть в предложении GROUP BY :
Всякий раз, когда Вы используете смесь отдельных элементов ( DEPARTMENT_ID ) и групповые функции ( COUNT ) в том же самом операторе SELECT , следует включать предложение GROUP BY , которое будет указывать отдельные элементы (в этом случае, DEPARTMENT_ID ). Если предложение GROUP BY отсутствует, появляется сообщение об ошибке “not a single-group group function” и звездочка ( * ) указывает незаконный столбец. Можно исправить ошибку в первом примере на рисунке, добавляя предложение GROUP BY :
SELECT department_id, count(last_name)
FROM employees
GROUP BY department_id;
Любой столбец или выражение в списке SELECT , который не находится в агрегатной функции, должен быть включен в предложение GROUP BY . Во втором примере на рисунке job_id не состоит в предложении GROUP BY и не используется групповой функцией, таким образом возникает ошибка “not a GROUP BY expression”. Можно исправить ошибку во втором примере рисунка, включая job_id в предложение GROUP BY .
SELECT department_id, job_id, COUNT(last_name)
FROM employees
GROUP BY department_id, job_id;
Некорректные Запросы с Использованием Групповых Функций
Нельзя использовать предложение WHERE , чтобы ограничить группы.
Вы используете предложение HAVING для ограничения групп.
Нельзя использовать групповые функции в предложении WHERE .
Предложение WHERE не может использоваться, чтобы ограничить группы. Оператор SELECT в примере на рисунке приводит к ошибке, потому что он использует предложение WHERE , чтобы ограничить вывод средних зарплат теми отделами, у которых средняя зарплата больше чем $8,000 .
Однако, можно исправить ошибку в примере при использовании предложения HAVING , чтобы ограничить группы:
Have you received an ORA-00937: not a single-group group function error? Learn what it is and how to fix it in this article.
The ORA-00937 error occurs when a query has an aggregate function (e.g. COUNT, MIN, MAX, SUM, or AVG) as well as other fields or statements, but there is no GROUP BY clause.
When you use one of these aggregate functions by itself, you can run a query without a GROUP BY clause. But, if you use it with another field or column, you need to use a GROUP BY clause to avoid the ORA-00937 error.
Let’s see the solutions to this which include some examples.
ORA-00937 Solution
There are a few ways you can resolve the ORA-00937: not a single-group group function error:
- Add the expressions that are in the SELECT clause into the GROUP BY clause (and add a GROUP BY clause if one doesn’t exist).
- Remove any other columns besides the aggregate function from your SELECT clause.
- Remove the aggregate function from the SELECT clause.
Solution 1: Add the expressions into the GROUP BY clause
Let’s say you had a query that looked like this:
SELECT department_id, SUM(salary)
FROM employee;
If you ran this query, you would get an error:
ORA-00937: not a single-group group function 00937. 00000 - "not a single-group group function"
This is because there is no GROUP BY clause, and you’re using an aggregate function (the SUM function) along with another field (department_id).
To correct this, add a GROUP BY clause, and add all expressions/columns to the GROUP BY clause that are in the SELECT clause and not an aggregate function. In this case, it’s the department_id column.
SELECT department_id, SUM(salary)
FROM employee
GROUP BY department_id;
Now we can run the statement:
DEPARTMENT_ID | SUM(SALARY) |
1 | 305000 |
212000 | |
6 | 2599500 |
2 | 2142000 |
5 | 2491000 |
4 | 1367300 |
8 | 1560000 |
3 | 2233000 |
7 | 1587000 |
Solution 2: Remove the expression from the SELECT clause
Let’s use the same query as solution 1 for our example:
SELECT department_id, SUM(salary)
FROM employee;
If you ran this query, you would get an error:
ORA-00937: not a single-group group function 00937. 00000 - "not a single-group group function"
To resolve this error, we could remove the department_id from the SELECT clause.
SELECT SUM(salary)
FROM employee;
If we run the query, we get a single value for the SUM of all salaries.
SUM(SALARY) |
14496800 |
Solution 3: Remove the aggregate function
Let’s use the same query as solution 1 for our example:
SELECT department_id, SUM(salary)
FROM employee;
If you ran this query, you would get an error:
ORA-00937: not a single-group group function 00937. 00000 - "not a single-group group function"
Another way to resolve this error is to remove the aggregate function. We could either leave the salary column there or remove it.
Here’s the query with the column remaining.
SELECT department_id, salary
FROM employee;
DEPARTMENT_ID | SALARY |
8 | 48000 |
3 | 79000 |
7 | 47000 |
3 | 51000 |
1 | 117000 |
7 | 21000 |
6 | 76500 |
7 | 34000 |
7 | 92000 |
8 | 32000 |
… | … |
Or, if we remove the column entirely:
SELECT department_id
FROM employee;
DEPARTMENT_ID |
8 |
3 |
7 |
3 |
1 |
7 |
6 |
7 |
7 |
8 |
… |
As you can see, there are several ways to resolve the ORA-00937: not a single-group group function error. It depends on what data you want to be returned from your query. It’s usually a simple fix, and I most often see it when I forget to add a GROUP BY to my query.
Lastly, if you enjoy the information and career advice I’ve been providing, sign up to my newsletter below to stay up-to-date on my articles. You’ll also receive a fantastic bonus. Thanks!
- Table of contents
- Error code 937, SQL state 42000: ORA-00937: not a single-group group function
- SQL Error [937] [42000]: ORA-00937: not a single-group group function
- ORA-00937: not a single-group group function Solution
- ORA-00937: not a single-group group function
- Oracle / PLSQL: ORA-00937 Error Message
Error code 937, SQL state 42000: ORA-00937: not a single-group group function
A SELECT list cannot include both a group function, such as AVG, COUNT, MAX, MIN, SUM, STDDEV, or VARIANCE, and an individual column expression, unless the individual column expression is included in a GROUP BY clause.
SELECT DP.CODE_VALEUR CODE, MAX(VA.CODE_TYPE_VALEUR) CODE_TYPE_VALEUR, MAX(VA.NOM_VALEUR) STOCK_NAME, (SUM(COURS_ACQ_VALEUR) / SUM(QUANTITE_VALEUR)) CMP, MAX(DP.CODE_COMPTE) CODE_COMPTE, SUM(DP.QUANTITE_VALEUR) QTEVALEUR, round(SUM(DP.VALORISATION_BOURSIERE), 3) VALORISATION_BOURSIERE, round((SUM(DP.VALORISATION_BOURSIERE) / SUM(DP.QUANTITE_VALEUR)), 3) COURS FROM DETAILPORTEFEUILLE DP, VALEUR VA WHERE DP.CODE_COMPTE IN (SELECT P.CODE_COMPTE_RATTACHE FROM PROCURATION P WHERE P.IDWEB_MASTER = 8 AND NVL(P.CAN_SEE_PORTEFEUILLE, 0) != 0) AND VA.CODE_VALEUR = DP.CODE_VALEUR AND DP.QUANTITE_VALEUR > 0 AND DP.CODE_VALEUR = 'TN0007250012'
GROUP BY DP.CODE_VALEUR
GROUP BY DP.CODE_VALEUR
SQL Error [937] [42000]: ORA-00937: not a single-group group function
Teams. Q&A for work. Connect and share knowledge within a single location that is structured and easy to search. Learn more
WITH BOXCOUNT AS ( SELECT PRODUCT_CODE , ROUND(SUM(TOTAL_QUANTITY/PACKING_STYLE)) AS FULLBOX , CASE WHEN SUM((TOTAL_QUANTITY - ROUND(SUM(TOTAL_QUANTITY/PACKING_STYLE))) * PACKING_STYLE) = 0 THEN 0 WHEN SUM((TOTAL_QUANTITY - ROUND(SUM(TOTAL_QUANTITY/PACKING_STYLE))) * PACKING_STYLE) > 0 THEN 1 END AS SPAREBOX FROM LOG0104M GROUP BY PRODUCT_CODE) SELECT L04.PRODUCT_CODE , L04.PRODUCT_NAME , L04.TOTAL_QUANTITY , L04.PACKING_STYLE , BC.FULLBOX , BC.SPAREBOX , SUM(BC.FULLBOX + BC.SPAREBOX) AS TOTALBOX FROM LOG0104M L04 JOIN BOXCOUNT BC ON BC.PRODUCT_CODE = L04.PRODUCT_CODE GROUP BY L04.PRODUCT_CODE , L04.PRODUCT_NAME , L04.TOTAL_QUANTITY , L04.PACKING_STYLE , BC.FULLBOX , BC.SPAREBOX
SQL Error [937] [42000]: ORA-00937: not a single-group group function
CASE WHEN SUM((TOTAL_QUANTITY - ROUND(SUM(TOTAL_QUANTITY/PACKING_STYLE))) * PACKING_STYLE) = 0 THEN 0 WHEN SUM((TOTAL_QUANTITY - ROUND(SUM(TOTAL_QUANTITY/PACKING_STYLE))) * PACKING_STYLE) > 0 THEN 1 END AS SPAREBOX
sum(CASE WHEN ((TOTAL_QUANTITY - ROUND((TOTAL_QUANTITY/PACKING_STYLE))) * PACKING_STYLE) = 0 THEN 0 WHEN ((TOTAL_QUANTITY - ROUND((TOTAL_QUANTITY/PACKING_STYLE))) * PACKING_STYLE) > 0 THEN 1 END) AS SPAREBOX
ORA-00937: not a single-group group function Solution
Solution 1: Add the expressions into the GROUP BY clause. ORA-00937: not a single-group group function 00937. 00000 — «not a single-group group …
SELECT department_id, SUM(salary) FROM employee;
ORA-00937: not a single-group group function 00937. 00000 - "not a single-group group function"
SELECT department_id, SUM(salary) FROM employee GROUP BY department_id;
SELECT department_id, SUM(salary) FROM employee;
ORA-00937: not a single-group group function 00937. 00000 - "not a single-group group function"
SELECT SUM(salary) FROM employee;
SELECT department_id, SUM(salary) FROM employee;
ORA-00937: not a single-group group function 00937. 00000 - "not a single-group group function"
SELECT department_id, salary FROM employee;
SELECT department_id FROM employee;
ORA-00937: not a single-group group function
I am Founder of SysDBASoft IT and IT Tutorial and Certified Expert about Oracle & SQL Server database, Goldengate, Exadata Machine, Oracle Database Appliance …
ORA-00937: not a single-group group function SQL> select sample_id,max(SAMPLE_TIME) from v$active_session_history; select sample_id,max(SAMPLE_TIME) from v$active_session_history * ERROR at line 1: ORA-00937: not a single-group group function
SQL> select sample_id,max(SAMPLE_TIME) from v$active_session_history; select sample_id,max(SAMPLE_TIME) from v$active_session_history * ERROR at line 1: ORA-00937: not a single-group group function
SQL> select sample_id,max(SAMPLE_TIME) from v$active_session_history group by sample_id;
SQL> select max(SAMPLE_TIME) from v$active_session_history; MAX(SAMPLE_TIME) --------------------------------------------------------------------------- 14-MAY-20 04.57.59.450 PM SQL>
ORA-00937: not a single-group group function
Cause: A SELECT list cannot include both a group function, such as AVG, COUNT, MAX, MIN, SUM, STDDEV, or VARIANCE, and an individual column expression, unless the individual …
select s.student_id, s.first_name, s.last_name, count(o.order_id) No from students s, orders o where s.student_id = o.student_id order by s.student_id;
select s.student_id, s.first_name, s.last_name, count(o.order_id) No from students s, orders o where s.student_id = o.student_id group by s.student_id, s.first_name, s.last_name, o.order_id order by s.student_id;
Oracle / PLSQL: ORA-00937 Error Message
Rewrite the SELECT statement so that the column or expression listed in the SELECT list is also found in the GROUP BY clause. Option #2. Remove the GROUP BY function (ie: MIN …
SELECT department, MIN(salary) AS "Lowest salary" FROM employees;
SELECT department, MIN(salary) AS "Lowest salary" FROM employees GROUP BY department;
Next Lesson PHP Tutorial
May 14, 2020
Sometimes You can get ” ORA-00937: not a single-group group function ” error.
ORA-00937: not a single-group group function
Details of error are as follows.
ORA-00937: not a single-group group function SQL> select sample_id,max(SAMPLE_TIME) from v$active_session_history; select sample_id,max(SAMPLE_TIME) from v$active_session_history * ERROR at line 1: ORA-00937: not a single-group group function
ORA-00937
This ORA-00937 error is related with your SELECT clause. Make sure that COUNT() and SUM() have to be grouped by all members in the SELECT clause, otherwise you will get this error.
A SELECT list cannot include both a group function, such as AVG, COUNT, MAX, MIN, SUM, STDDEV, or VARIANCE, and an individual column expression, unless the individual column expression is included in a GROUP BY clause.
not a single-group group function
In other words, you tried to execute a SELECT statement that requires a GROUP BY clause without including the GROUP BY clause. If you are using an aggregate function in your select query (e.g. AVG, COUNT, MAX, MIN…), you must have a GROUP BY clause.
SQL> select sample_id,max(SAMPLE_TIME) from v$active_session_history; select sample_id,max(SAMPLE_TIME) from v$active_session_history * ERROR at line 1: ORA-00937: not a single-group group function
To solve this error, you should add group by clause with the missing column as follows.
SQL> select sample_id,max(SAMPLE_TIME) from v$active_session_history group by sample_id;
Or you can remove the sample_id column from SELECT clause, and it works fine.
SQL> select max(SAMPLE_TIME) from v$active_session_history; MAX(SAMPLE_TIME) --------------------------------------------------------------------------- 14-MAY-20 04.57.59.450 PM SQL>
If you got Error : ORA-00937: not a single-group group function occurs on SQL execution in Oracle 12.2.0.1, then apply the following patch.
Unpublished Bug 25435038 – ORA-00600:[KKQCSCPOPNWITHMAP: 0] GBP AGG ON OBY WITH 2 TABLE JOIN-EXPLAIN PLAN
Install patch 25435038
Do you want to learn Oracle Database for Beginners, then Click and read the following articles.
Oracle Database Tutorials for Beginners ( Junior Oracle DBA )
2,058 views last month, 2 views today
About Mehmet Salih Deveci
I am Founder of SysDBASoft IT and IT Tutorial and Certified Expert about Oracle & SQL Server database, Goldengate, Exadata Machine, Oracle Database Appliance administrator with 10+years experience.I have OCA, OCP, OCE RAC Expert Certificates I have worked 100+ Banking, Insurance, Finance, Telco and etc. clients as a Consultant, Insource or Outsource.I have done 200+ Operations in this clients such as Exadata Installation & PoC & Migration & Upgrade, Oracle & SQL Server Database Upgrade, Oracle RAC Installation, SQL Server AlwaysOn Installation, Database Migration, Disaster Recovery, Backup Restore, Performance Tuning, Periodic Healthchecks.I have done 2000+ Table replication with Goldengate or SQL Server Replication tool for DWH Databases in many clients.If you need Oracle DBA, SQL Server DBA, APPS DBA, Exadata, Goldengate, EBS Consultancy and Training you can send my email adress [email protected].- -Oracle DBA, SQL Server DBA, APPS DBA, Exadata, Goldengate, EBS ve linux Danışmanlık ve Eğitim için [email protected] a mail atabilirsiniz.
In my previous article I have given the different types of oracle errors with its resolution. We have also given the group by statement with real examples. There are so many times you will get error like not a single-group function and how to resolve this error step by step. The ORA-00937 error is most commonly coming oracle error when you try to use group by function. We will check the detailed steps about the resolving ora-00937 error.
What will you find in this article?
1.ORA-00937 : not a single-group function
2.How to resolve ORA-00937 error with example.
In this section we will see details about the ORA-00937 : not a single-group function error and will try to check why ora-00937 error is occurring.
The error ora-00937 error will come due to the group by command improperly used. you know that group by function is used to grouping the specified data in SQL.
Real example of group by :
If CEO wants count of employees who joined our company departmentwise then we need to use the group by function.
Select count(*) from Employees group by department;
The above statement is used to group the employees count by departments.
We require to remember that the group by function is used with aggregate functions to filter result by value. The cause of the above error is if you are using the group by statement with wrong syntax then above error will occur. If the set of data does not contain the group data then these kind of errors will occure.
Note : If you are using aggregate functions like AVG, COUNT, MAX, MIN, SUM, STDDEV, or VARIANCE then you must need to use the group by with those functions. A SELECT list cannot include both a group function, such as AVG, COUNT, MAX, MIN, SUM, STDDEV, or VARIANCE, and an individual column expression, unless the individual column expression is included in a GROUP BY clause.
How to resolve the ORA-00937 error?
In this section we will see the resolution of ora-00937 error with examples.
To resolve the error, you can either remove the group function or column expression from the SELECT clause or you can add a GROUP BY clause that includes the column expressions.
Real example :
If you choose to add the GROUP BY clause, make sure to include the column expressions and follow the correct order. Take the example of the CEO who wants to view a list of employees who worked the most number of hours, organized by department. The correct syntax that includes the GROUP BY clause would be
FROM employees GROUP BY department;
SELECT department, MAX(hours) AS “Maximum Hours”
These are some most important examples and resolution of resolving the error ORA-00937 : not a single-group function. If you like this article or if you have any concerns with the same kindly comment in comments section.