Проблема Oracle в группе по - PullRequest
0 голосов
/ 21 сентября 2018

Я знаю, что этот вопрос задают многие люди.Но я все еще не мог понять, почему это происходит.Не могу понять эту логику.

У меня есть таблица mytesttable со столбцами id, company_name и employee_name.

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

select * 
from mytesttable 
group by company_name;

Но я получаю следующую проблему:

ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"
*Cause:    
*Action:
Error at Line: 28 Column: 2

Теперь я попытался поместить count (1) в select вместе со своими столбцами, попытался сгруппироватьиспользование 2 столбцов и т. д. Все та же проблема.Может кто-нибудь объяснить мне, как этого добиться?

Потому что это простая группа.Логика кажется правильной, но мне интересно, почему она не приносит мне результата.

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018

Если вы используете выражение group-by, вы должны использовать агрегатные функции, такие как max, min, medium, count в операторах выбора.

Например;

select count(*),company_name,employee_name
  from mytesttable
 group by company_name,employee_name
 order by company_name;
0 голосов
/ 21 сентября 2018

Ваш запрос:

select *
from mytesttable
group by company_name;

* распространяется на все столбцы.Таким образом, это становится:

select company_name, col1, col2, col3, . . .  -- your question doesn't specify the column names
from mytesttable
group by company_name;

Когда вы указываете group by, вы указываете, что в наборе результатов есть одна строка на company_name.Другие столбцы обычно заполняются функциями агрегирования , такими как MIN(), SUM() или LISTAGG().

Какое значение следует выбрать для col1?В общем, SQL не пытается ответить на этот вопрос.Вместо этого он возвращает синтаксическую ошибку.Это не специфично для Oracle.Это определение языка.

Что вы, вероятно, хотите:

select company_name, count(*) as num_employees
from mytesttable
group by company_name;
0 голосов
/ 21 сентября 2018

Я думаю, вы неправильно понимаете, что делает GROUP BY?

Он не ставит все подобные записи рядом друг с другом, это ORDER BY.Что делает GROUP BY, так это сворачивает все похожие записи в одну и ту же строку, чтобы разрешить агрегированные вычисления, такие как SUM() и MIN() и COUNT() и т. Д.

Итак, два примера с использованием одного и того же ввода...

 id | company_name | employee_name
----+--------------+---------------
 1  | zzz          | aaa
 2  | xxx          | bbb
 3  | yyy          | ccc
 4  | zzz          | ddd
 5  | xxx          | eee

Использование ORDER BY ...

SELECT * FROM mytesttable ORDER BY company_name, employee_name

 id | company_name | employee_name
----+--------------+---------------
 2  | xxx          | bbb
 5  | xxx          | eee
 3  | yyy          | ccc
 1  | zzz          | aaa
 4  | zzz          | ddd

Использование GROUP BY ...

SELECT
  company_name,
  COUNT(*)       number_of_employees,
  MAX(id)        highest_id_in_company
FROM
  mytesttable
GROUP BY
  company_name
ORDER BY
  company_name

 company_name | number_of_employees | highest_id_in_company
--------------+---------------------+-----------------------
 xxx          | 2                   | 5
 yyy          | 1                   | 3
 zzz          | 2                   | 4
0 голосов
/ 21 сентября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...