Меню

Group function is not allowed here ошибка

totn Oracle Error Messages


Learn the cause and how to resolve the ORA-00934 error message in Oracle.

Description

When you encounter an ORA-00934 error, the following error message will appear:

  • ORA-00934: group function is not allowed here

Resolution

The option(s) to resolve this Oracle error are:

Option #1

Try removing the group function from the WHERE clause or GROUP BY clause. If required, you can move the group function to the HAVING clause.

For example, if you tried to execute the following SQL statement:

SELECT department, SUM(sales) AS "Total sales"
FROM order_details
WHERE SUM(sales) > 1000
GROUP BY department;

You would receive the following error message:

Oracle PLSQL

You could correct this statement by using the HAVING clause as follows:

SELECT department, SUM(sales) AS "Total sales"
FROM order_details
GROUP BY department
HAVING SUM(sales) > 1000;

Option #2

You could also try moving the group by function to a SQL subquery.

For example, if you tried to execute the following SQL statement:

SELECT department, SUM(sales) AS "Total sales"
FROM order_details
WHERE SUM(sales) > 1000
GROUP BY department;

You would receive the following error message:

Oracle PLSQL

You could correct this statement by using a subquery as follows:

SELECT order_details.department,
SUM(order_details.sales) AS "Total sales"
FROM order_details, (SELECT department, SUM(sales) AS "Sales_compare"
                     FROM order_details
                     GROUP BY department) subquery1
WHERE order_details.department = subquery1.department
AND subquery1.Sales_compare > 1000
GROUP BY order_details.department;

May 27, 2021

I got ” ORA-00934: group function is not allowed here ”  error in Oracle database.

ORA-00934: group function is not allowed here

Details of error are as follows.

SELECT name, surname count(*) FROM employee WHERE Count(*) > 1 GROUP BY surname;

ORA – 00934: GROUP FUNCTION IS NOT ALLOWED HERE

00964, 00000 – “group function is not allowed here”



GROUP FUNCTION IS NOT ALLOWED HERE

This ORA-00934 error is related to the group function which is not allowed.

You need to use HAVING CLAUSE For filtering if you use Aggregate function ( AVG, COUNT, MAX, MIN, SUM, STDDEV, or VARIANCE, ) in where clause.

To solve this error, use HAVING clause instead of where like following.

SELECT name, surname count(*) FROM employee GROUP BY surname HAVING Count(*) > 1;

Do you want to learn Oracle Database for Beginners, then read the following articles.

Oracle Tutorial | Oracle Database Tutorials for Beginners ( Junior Oracle DBA )

 1,446 views last month,  1 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.

Vyzov

6 / 6 / 2

Регистрация: 19.02.2013

Сообщений: 68

1

Подзапрос

27.05.2014, 17:07. Показов 3188. Ответов 8

Метки нет (Все метки)


Есть запрос:

SQL
1
2
3
 SELECT ВРАЧ.ID, COUNT(РАБОТА.РАБОТАID), MAX(РАБОТА.ЦЕНА)
            FROM ВИЗИТ, ВРАЧ, РАБОТА WHERE ВИЗИТ.ВРАЧID = ВРАЧ.ID AND ВИЗИТ.РАБОТАID = РАБОТА.РАБОТАID 
                GROUP BY ВРАЧ.ID

Он выдает такую штуку

ID COUNT(РАБОТА.РАБОТАID) MAX(РАБОТА.ЦЕНА)
1 1 1
2 2 3
4 1 4

Теперь нужно из этого вложенного запроса вытащить ID врача (тобишь четверочку), который сделал больше всего самой дорогой работы. У меня это выглядит вот так…

SQL
1
2
3
4
5
6
7
8
9
SELECT ВРАЧ.ID, COUNT(РАБОТА.РАБОТАID)
    FROM
    (
        SELECT ВРАЧ.ID, COUNT(РАБОТА.РАБОТАID), MAX(РАБОТА.ЦЕНА)
            FROM ВИЗИТ, ВРАЧ, РАБОТА WHERE ВИЗИТ.ВРАЧID = ВРАЧ.ID AND ВИЗИТ.РАБОТАID = РАБОТА.РАБОТАID 
                GROUP BY ВРАЧ.ID
    )
    WHERE РАБОТА.ЦЕНА = MAX(РАБОТА.ЦЕНА)
        GROUP BY ВРАЧ.ID

Но такая вот беда: ORA-00934: group function is not allowed here
В sql мелкософта было бы как-то так, видимо в ораке подзапросы делаются иначе -___-
Есть кто-нибудь знающий как допилить сие?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

27.05.2014, 17:07

Ответы с готовыми решениями:

Подзапрос с группировкой
Добрый день, подскажите что не так в в моём запросе:

SELECT
projects.project_id,

Подзапрос в триггере
CREATE OR REPLACE TRIGGER order_info_insert
BEFORE INSERT
ON RESULTS
FOR EACH ROW
BEGIN
IF…

Исправить подзапрос
Пока за процедуры не брался, тут решил повторить подзапросы, вот решил написать сам подзапрос, чтоб…

Подзапрос из другой БД
Есть две БД (обе на оракл). Я зашел под некоторым пользователем в одну из этих баз данных. Но при…

8

alexey1327

27.05.2014, 22:54

2

Можно просто отсортировать ваш запрос по MAX(РАБОТА.ЦЕНА) desc и выбрать rownum = 1
т.е.

SQL
1
2
3
4
5
6
7
8
9
SELECT *
    FROM
    (
        SELECT ВРАЧ.ID, COUNT(РАБОТА.РАБОТАID), MAX(РАБОТА.ЦЕНА)
            FROM ВИЗИТ, ВРАЧ, РАБОТА WHERE ВИЗИТ.ВРАЧID = ВРАЧ.ID AND ВИЗИТ.РАБОТАID = РАБОТА.РАБОТАID 
                GROUP BY ВРАЧ.ID
                ORDER BY MAX(РАБОТА.ЦЕНА) DESC
    )
    WHERE rownum = 1

25 / 25 / 10

Регистрация: 20.09.2009

Сообщений: 110

28.05.2014, 08:36

3

alexey1327,

А Вас не смущает тот факт, что на поиски одной строки вы тратите большое количество ресурсов на группировку и явную сортировку? ИМХО, ваш код, как минимум, слишком ресурсозатратен…

Добавлено через 14 минут
и кстати, Ваш запрос не учитывает случай, когда существует 2 разных врача, у которых количество работ одинаковое и максимальная цена тоже одинаковая. И вместо 2х логически верных строк вы получите неполный результат в 1 строку

Добавлено через 2 минуты
я бы автору темы порекомендовал использовать dense_rank



0



Vyzov

6 / 6 / 2

Регистрация: 19.02.2013

Сообщений: 68

29.05.2014, 22:08

 [ТС]

4

Как оказалось, данное решение проблемы не подходит, нужно именно через вложенные запросы…
Правда каскадная их реализация у меня вызывает лютый батхерд (Так скучаю по SQL мелкософта Т_Т)

SQL
1
 (SELECT COUNT(РАБОТА.РАБОТАID),FROM РАБОТА WHERE РАБОТА.ЦЕНА = (SELECT MAX(РАБОТА.ЦЕНА) FROM РАБОТА)GROUP BY ВРАЧ.ID)

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

Добавлено через 2 часа 56 минут
Есть здравые мысли? А то я уже 6-й час с этим запросом… маюсь =(



0



25 / 25 / 10

Регистрация: 20.09.2009

Сообщений: 110

30.05.2014, 07:48

5

в сообщении, выше твоего, я написал уже, что тебе следует использовать dense_rank



0



Vyzov

6 / 6 / 2

Регистрация: 19.02.2013

Сообщений: 68

02.06.2014, 14:28

 [ТС]

6

Сваял я запрос с подзапросами выдающий то, что требуется:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
SELECT ВРАЧ.ФАМИЛИЯ
    FROM ВРАЧ,
    (
SELECT TR.VR2 AS RESULTID
     FROM
     (
    SELECT ВРАЧ.ID AS VR2, SUM(РАБОТА.ЦЕНА) AS SC
    FROM РАБОТА, ВРАЧ, ВИЗИТ, 
    
    (SELECT ВРАЧ.ID AS VR, MAX(РАБОТА.ЦЕНА) AS MC
    FROM РАБОТА, ВРАЧ, ВИЗИТ
    WHERE    ВИЗИТ.ВРАЧID = ВРАЧ.ID AND ВИЗИТ.РАБОТАID = РАБОТА.РАБОТАID
        GROUP BY ВРАЧ.ID) TMAX
    
    WHERE    ВИЗИТ.ВРАЧID = ВРАЧ.ID AND ВИЗИТ.РАБОТАID = РАБОТА.РАБОТАID AND РАБОТА.ЦЕНА = TMAX.MC AND ВРАЧ.ID = TMAX.VR
    GROUP BY ВРАЧ.ID
        ) TR
            WHERE TR.SC = 
     (SELECT MAX(TR2.SC)
         FROM
        (SELECT SUM(РАБОТА.ЦЕНА) AS SC
    FROM РАБОТА, ВРАЧ, ВИЗИТ, 
    
    (SELECT ВРАЧ.ID AS VR, MAX(РАБОТА.ЦЕНА) AS MC
    FROM РАБОТА, ВРАЧ, ВИЗИТ
    WHERE    ВИЗИТ.ВРАЧID = ВРАЧ.ID AND ВИЗИТ.РАБОТАID = РАБОТА.РАБОТАID
        GROUP BY ВРАЧ.ID) TMAX
    
    WHERE    ВИЗИТ.ВРАЧID = ВРАЧ.ID AND ВИЗИТ.РАБОТАID = РАБОТА.РАБОТАID AND РАБОТА.ЦЕНА = TMAX.MC AND ВРАЧ.ID = TMAX.VR
    GROUP BY ВРАЧ.ID
    ) TR2
    )
     ) RESULT
WHERE ВРАЧ.ID = RESULT.RESULTID​

Препод сказал что сие есть слишком хитро (для кого я так и не понял)
и попросил сделать на связях… видимо таблиц..
Такая штука

SQL
1
ВИЗИТ INNER JOIN ВРАЧ ON ВИЗИТ.ВРАЧID = ВРАЧ.ID INNER JOIN РАБОТА ON ВИЗИТ.РАБОТАID = РАБОТА.РАБОТАID

вместо перечисления таблиц ВИЗИТ, РАБОТА, ВРАЧ ломает запрос =(
Дело в том что БД для которой делается этот запрос весьма кривая в плане связи таблиц…

Подзапрос

Визит
/ |
Врач Работа клиент
Поэтому не очень представляю как выполнить связи таблиц в запросе, есть ли какие-нибудь соображение по этому поводу?



0



25 / 25 / 10

Регистрация: 20.09.2009

Сообщений: 110

02.06.2014, 15:37

7

честно говоря, я 5 раз прочитал. но так и не понял в чем у тебя загвоздка. Зачем ты изобретаешь велосипед, мне также непонятно. Открой для себя аналитические функции. DENSE_RANK



0



6 / 6 / 2

Регистрация: 19.02.2013

Сообщений: 68

03.06.2014, 09:08

 [ТС]

8

Цитата
Сообщение от mlc
Посмотреть сообщение

честно говоря, я 5 раз прочитал. но так и не понял в чем у тебя загвоздка.

Загвоздка в том, что я сделал то что от меня просили. Теперь же требуют точно того же, но со связями таблиц (Inner join)… хотя у меня это заменено условиями подзапроcов в разделе where… Препод категорически отказывается это понимать и требует inner join’ов…

т.к. я это решение еле придумал, других вариантов я не вижу, а они нужны =(
поэтому и пишу здесь



0



mlc

25 / 25 / 10

Регистрация: 20.09.2009

Сообщений: 110

03.06.2014, 10:23

9

Vyzov, я так понял в доку вы смотреть на dense_rank не хотите. Вот тогда наглядный пример

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
WITH 
doctor AS 
(
  SELECT column_value id, 'Врач №-' || column_value Surname FROM TABLE(sys.odcinumberlist(1,2,3,3,4,5))
),
job AS 
(
  SELECT column_value id, column_value * 100 price FROM TABLE(sys.odcinumberlist(6,7,8,9))
),
visit AS 
(
  SELECT 1 id_doctor, 6 id_job FROM dual
    UNION ALL
  SELECT 2, 7 FROM dual
    UNION ALL
  SELECT 2, 8 FROM dual
    UNION ALL
  SELECT 4, 9 FROM dual
)
SELECT id, Surname, max_price FROM
(
  SELECT d.ID,
    d.Surname,
    MAX(j.price) max_price,
    DENSE_RANK()OVER(ORDER BY COUNT(v.id_job) DESC,MAX(j.price) DESC) rn
  FROM visit v
    JOIN doctor d
      ON v.id_doctor = d.ID
    JOIN job j
      ON v.id_job = j.id
  GROUP BY d.id,
    Surname
) WHERE rn = 1;
 
/
 
        ID SURNAME                                          MAX_PRICE
---------- ----------------------------------------------- ----------
         2 Врач №-2                                              800 
 
Elapsed: 00:00:00.016



0



0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • He2 ошибка стиральной машины samsung как исправить
  • Google 404 произошла ошибка