Меню

Ошибка групповая функция не является одногруппной

Так в чём же причина ошибки (или заблуждение автора вопроса).

Оператор суммирования + выполнется для значений колонок или выражений полученных из одной записи (по горизонтали). Групповая функция 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

poplan

1 / 1 / 0

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

Сообщений: 166

1

24.04.2019, 10:08. Показов 4013. Ответов 9

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


SQL
1
2
3
4
5
6
7
8
9
10
11
12
SELECT P.TOVAR_ID,
      P.OSTATOK_TOVARA,
      COUNT((SELECT OSTATOK_TOVARA FROM POSTAVKI P, KATEGORIYA_TOVARA K, TOVARI T
            WHERE P.TOVAR_ID = T.TOVAR_ID AND
                  T.KATEGORIYA = K.KATEGORIYA AND
                  K.SROK_REALIZACII > SYSDATE)) AS Neist,
      COUNT((SELECT OSTATOK_TOVARA FROM POSTAVKI P, KATEGORIYA_TOVARA K, TOVARI T
            WHERE P.TOVAR_ID = T.TOVAR_ID AND
                  T.KATEGORIYA = K.KATEGORIYA AND
                  K.SROK_REALIZACII < SYSDATE)) AS Ist
FROM POSTAVKI P, TOVARI T
WHERE P.TOVAR_ID = T.TOVAR_ID;

В чем проблема?

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



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…
Тут надо определится, либо в select писать «выбираемое» другим select’ом поле, либо (используя count) переписывать запрос.



1



Модератор

4186 / 3026 / 576

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

Сообщений: 13,096

24.04.2019, 11:07

3

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

В чем проблема?

Запрос выглядит довольно страшненько. Почему бы все JOIN не делать в основном запросе, а в COUNT анализировать только срок реализации?



0



poplan

1 / 1 / 0

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

Сообщений: 166

24.04.2019, 12:02

 [ТС]

4

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT DISTINCT
      P.TOVAR_ID,
      P.OSTATOK_TOVARA,
      (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,
      (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 Ist
FROM POSTAVKI P INNER JOIN TOVARI T ON P.TOVAR_ID = T.TOVAR_ID;

count оказался ненужным, но теперь другой вопрос.
Как сравнить ОСТАТОК ТОВАРА, который я выбираю в 3 строке с последующими подзапросами (например в 4 строке), то есть я выбрал ОСТАТОК ТОВАРА и в дальнейшем мне надо посмотреть сколько там с истекшим сроком реализации и неистекшим, а то получается что подзапрос смотрит новые значения и получается больше строк чем надо



0



Модератор

4186 / 3026 / 576

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

Сообщений: 13,096

24.04.2019, 13:50

5

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

(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. Вы просрочку считаете исходя из того, что «Срок реализации» в таблице «Категории товара» — это дата. А это НЕ дата! Это количество часов/дней. В зависимости как принят учет. Но, как правило — это часы за которые нужно реализовать товар.
2. Исходя из вышесказанного, можно привести условный пример, что:
просрочка определяется как условие, что из поставки №123456 от «01.03.2019 06:30:00» осталось 10 единиц товара (например срок реализации которого 24 часа) на дату бОльшую чем «02.03.2019 06:30:00».
3. Соответсвенно непросрочка — это когда срок реализации в часах больше чем разница между текущей датой и датой поставки.

Как-то так это должно быть исходя из указанной вами схемы.

Возможное решение задачи может быть таким:

Oracle 11 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
CREATE TABLE t_vendor (
       vendor_id NUMBER PRIMARY KEY,
       vendoe_name VARCHAR2(100),
       vendor_address VARCHAR2(200)
);
 
CREATE TABLE t_prod_category (
       category_id NUMBER PRIMARY KEY,
       cat_name VARCHAR2(100),
       period NUMBER
);
 
CREATE TABLE t_prod (
       prod_id NUMBER PRIMARY KEY,
       prod_name VARCHAR2(200),
       prod_cat NUMBER,
       prod_unit VARCHAR2(20),
       prod_weight NUMBER,
       min_reserve NUMBER,
       CONSTRAINT prod_cat_fk FOREIGN KEY (prod_cat) REFERENCES t_prod_category(category_id)
);
 
CREATE TABLE t_delivery (
       delivery_id NUMBER PRIMARY KEY,
       delivery_code NUMBER,
       vendor_id NUMBER,
       prod_id NUMBER,
       prod_amount NUMBER,
       unit_cost NUMBER(10,2),
       delivery_date DATE,
       prod_remain NUMBER,
       CONSTRAINT vendor_id_fk FOREIGN KEY (vendor_id) REFERENCES t_vendor(vendor_id),
       CONSTRAINT prod_id_fk FOREIGN KEY (prod_id) REFERENCES t_prod(prod_id)
);

Сам запрос:

Oracle 11 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
WITH
v_pros AS (
  SELECT td.prod_id, SUM(td.prod_remain) AS pros
  FROM t_delivery td
  WHERE TRUNC((SYSDATE - td.delivery_date)*24) > (SELECT tpc.period FROM t_prod_category tpc
                                                  WHERE tpc.category_id = (SELECT tp.prod_cat FROM t_prod tp
                                                                           WHERE tp.prod_id = td.prod_id))
        AND td.prod_remain > 0
  GROUP BY td.prod_id
),
v_nepros AS (
  SELECT td.prod_id, SUM(td.prod_remain) AS nepros
  FROM t_delivery td
  WHERE TRUNC((SYSDATE - td.delivery_date)*24) < (SELECT tpc.period FROM t_prod_category tpc
                                                  WHERE tpc.category_id = (SELECT tp.prod_cat FROM t_prod tp
                                                                           WHERE tp.prod_id = td.prod_id))
        AND td.prod_remain > 0
  GROUP BY td.prod_id
)
 
SELECT CASE
        WHEN vp.prod_id IS NOT NULL AND vnp.prod_id IS NULL THEN (SELECT tp.prod_name FROM t_prod tp WHERE tp.prod_id = vp.prod_id)
        WHEN vp.prod_id IS NULL AND vnp.prod_id IS NOT NULL THEN (SELECT tp.prod_name FROM t_prod tp WHERE tp.prod_id = vnp.prod_id)
        WHEN vp.prod_id IS NOT NULL AND vnp.prod_id IS NOT NULL THEN (SELECT tp.prod_name FROM t_prod tp WHERE tp.prod_id = vp.prod_id)
       END AS "Товар",
       NVL(vp.pros, 0) AS "Просрочка", NVL(vnp.nepros, 0) AS "Непросрочка"
FROM v_pros vp FULL OUTER JOIN v_nepros vnp ON (vp.prod_id = vnp.prod_id)
ORDER BY "Товар"
;



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:

  1. 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).
  2. Remove any other columns besides the aggregate function from your SELECT clause.
  3. 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!

i face ORA-00937: not a single-group group function
00937. 00000 — «not a single-group group function» error problem in this sql query

select c.First_Name,sum(r.installment_number)
from LMS_CUSTOMER_M c, LMS_REPAYSCH_DTL r,LMS_AGREEMENT_DTL a
where (c.Customer_ID=a.Lessee_ID and a.agreement_id= r.agreement_id)
and a.Loan_Disbursal_Date < r.Installment_Due_Date;

Barbaros Özhan's user avatar

asked Oct 14, 2020 at 17:18

virupaksh pandey's user avatar

You need to add group by clause as you are using sum() aggregation with a column

select c.First_Name,sum(r.installment_number)
from LMS_CUSTOMER_M c join LMS_AGREEMENT_DTL a on c.Customer_ID=a.Lessee_ID
join LMS_REPAYSCH_DTL r on a.agreement_id= r.agreement_id
where a.Loan_Disbursal_Date < r.Installment_Due_Date
group by c.First_Name

answered Oct 14, 2020 at 17:20

Fahmi's user avatar

FahmiFahmi

37.1k5 gold badges21 silver badges29 bronze badges

if you use an aggregation function (sum in you query) you must use a GROUP BY.

select c.First_Name,sum(r.installment_number)
from LMS_CUSTOMER_M c, LMS_REPAYSCH_DTL r,LMS_AGREEMENT_DTL a
where (c.Customer_ID=a.Lessee_ID and a.agreement_id= r.agreement_id)
and a.Loan_Disbursal_Date < r.Installment_Due_Date
GROUP BY c.First_Name;

https://www.w3schools.com/sql/sql_groupby.asp

answered Oct 14, 2020 at 17:22

Cyrille MODIANO's user avatar

Cyrille MODIANOCyrille MODIANO

2,1692 gold badges18 silver badges32 bronze badges

You cannot use sum without aggregating functions group by:

select c.First_Name,sum(r.installment_number)
from LMS_CUSTOMER_M c, LMS_REPAYSCH_DTL r,LMS_AGREEMENT_DTL a
where (c.Customer_ID=a.Lessee_ID and a.agreement_id= r.agreement_id)
and a.Loan_Disbursal_Date < r.Installment_Due_Date
GROUP BY c.First_Name;

answered Oct 14, 2020 at 17:40

Alexey Roschin's user avatar

i face ORA-00937: not a single-group group function
00937. 00000 — «not a single-group group function» error problem in this sql query

select c.First_Name,sum(r.installment_number)
from LMS_CUSTOMER_M c, LMS_REPAYSCH_DTL r,LMS_AGREEMENT_DTL a
where (c.Customer_ID=a.Lessee_ID and a.agreement_id= r.agreement_id)
and a.Loan_Disbursal_Date < r.Installment_Due_Date;

Barbaros Özhan's user avatar

asked Oct 14, 2020 at 17:18

virupaksh pandey's user avatar

You need to add group by clause as you are using sum() aggregation with a column

select c.First_Name,sum(r.installment_number)
from LMS_CUSTOMER_M c join LMS_AGREEMENT_DTL a on c.Customer_ID=a.Lessee_ID
join LMS_REPAYSCH_DTL r on a.agreement_id= r.agreement_id
where a.Loan_Disbursal_Date < r.Installment_Due_Date
group by c.First_Name

answered Oct 14, 2020 at 17:20

Fahmi's user avatar

FahmiFahmi

37.1k5 gold badges21 silver badges29 bronze badges

if you use an aggregation function (sum in you query) you must use a GROUP BY.

select c.First_Name,sum(r.installment_number)
from LMS_CUSTOMER_M c, LMS_REPAYSCH_DTL r,LMS_AGREEMENT_DTL a
where (c.Customer_ID=a.Lessee_ID and a.agreement_id= r.agreement_id)
and a.Loan_Disbursal_Date < r.Installment_Due_Date
GROUP BY c.First_Name;

https://www.w3schools.com/sql/sql_groupby.asp

answered Oct 14, 2020 at 17:22

Cyrille MODIANO's user avatar

Cyrille MODIANOCyrille MODIANO

2,1692 gold badges18 silver badges32 bronze badges

You cannot use sum without aggregating functions group by:

select c.First_Name,sum(r.installment_number)
from LMS_CUSTOMER_M c, LMS_REPAYSCH_DTL r,LMS_AGREEMENT_DTL a
where (c.Customer_ID=a.Lessee_ID and a.agreement_id= r.agreement_id)
and a.Loan_Disbursal_Date < r.Installment_Due_Date
GROUP BY c.First_Name;

answered Oct 14, 2020 at 17:40

Alexey Roschin's user avatar

totn Oracle Error Messages


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

Description

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

  • ORA-00937: not a single-group group function

Resolution

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

Option #1

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 Function, MAX Function, SUM Function, COUNT Function) from the SELECT statement.

Option #3

Remove the expression from the SELECT list that was not in the GROUP BY clause.

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

SELECT department, MIN(salary) AS "Lowest salary"
FROM employees;

You would receive the following error message:

Oracle PLSQL

You could correct this by including department in the GROUP BY clause as follows:

SELECT department, MIN(salary) AS "Lowest salary"
FROM employees
GROUP BY department;

Я работаю над запросом Hibernate. Этот запрос отлично работает с MySQL, но не работает в Oracle и postgreSQL.

SELECT MIN(t.startTime) AS StartTime,
MAX(t.endTime) AS EndTime,
(SELECT SUM(t2.occurances) from table2 as t2)
from table1 as t1

И я получаю ошибку-

ORA-00937: не групповая функция для одной группы

Как мне решить эту проблему? Эта таблица возвращает только одну строку. Если я добавлю группу, добавив дополнительный столбец в SELECT, он вернет более одной строки.

3 ответа

Лучший ответ

Просто добавьте GROUP BY для третьего столбца:

SELECT MIN(t1.startTime) AS StartTime,
  MAX(t1.endTime) AS EndTime,
  (SELECT SUM(t2.occurances) FROM table2 t2) as occurances
FROM table1 t1
GROUP BY 3

Этот запрос возвращает одну строку.

РЕДАКТИРОВАТЬ:

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

SELECT MIN(t1.startTime) AS StartTime,
  MAX(t1.endTime) AS EndTime,
  MAX( (SELECT SUM(t2.occurances) FROM table2 t2) ) as occurances
FROM table1 t1


1

Rimas
24 Сен 2014 в 19:33

Это отлично работает для MySQL из-за расширений MySQL для group by. К сожалению, компилятор не обрабатывает подзапросы как «константы», когда он смотрит на запросы агрегирования. Итак, это просто еще одно выражение, которого нет в предложении group by.

Вот способ написать запрос, совместимый для всех трех баз данных (но не для Hibernate):

SELECT MIN(t.startTime) AS StartTime, MAX(t.endTime) AS EndTime, MAX(occurrences)
from table1 t1 cross join
     (SELECT SUM(t2.occurrences) as occurrences from table2 t2) t2;

Я должен добавить, что вы также не можете добавить подзапрос в предложение group by, хотя следующее будет работать в Oracle и Postgres:

SELECT MIN(t.startTime) AS StartTime, MAX(t.endTime) AS EndTime,
       (SELECT SUM(t2.occurances) from table2 t2)
FROM table1 t1
GROUP BY 3;

РЕДАКТИРОВАТЬ:

HQL довольно ограничен по сравнению со стандартным SQL. Следующее идет близко к двум, что вы хотите, но возвращает по крайней мере две строки вместо 1:

select t.starttime, t.endtime, (SELECT SUM(t2.occurances) from table2 t2)
from table1 t
where t.starttime = (select min(starttime) from table1) or
      t.endtime = (select max(endtime) from table1);


2

Gordon Linoff
24 Сен 2014 в 18:03

Попробуй это:

with t1 as (
    SELECT MIN(t.startTime) AS StartTime,
    MAX(t.endTime) AS EndTime
    from table1 as t1
), t2 as (
    SELECT SUM(t2.occurances) occurances from table2 as t2
)
select t1.starttime, t1.endtime, t2.occurances
  from t1, t2


1

neshkeev
24 Сен 2014 в 17:44

Oracle PL/SQL error message: 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 column expression is included in a GROUP BY clause.

Solution:

Drop either the group function or the individual column expression from the SELECT list or add a GROUP BY clause that includes all individual column expressions listed.

Students table

STUDENT_ID FIRST_NAME LAST_NAME
1 Daniel SCOTT
2 Anthony SIMMONS
3 Sophia THOMPSON
4 Emily PETERSON
5 David DAWSON
6 Gabriel LEWIS

Orders table

ORDER_ID COURSE_ID STUDENT_ID
1 1 6
3 4 5
21 5 6
22 1 4

Example:

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;

Output:

ORA-00937: not a single-group group function

Correct:

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;

Output:

STUDENT_ID FIRST_NAME LAST_NAME NO
4 Emily PETERSON 1
5 David DAWSON 1
6 Gabriel LEWIS 1
6 Gabriel LEWIS 1

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

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

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

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка группа 060 недоступна
  • Ошибка датчик парковки ниссан т32