2015-01-01 2 views
0

Iam пытается выбрать 2 значения из таблицы, Employee emp_name, emp_location group by emp_location, iam знает, что столбцы, которые находятся в группе по функции, должны находиться в предложении select, но i хотел бы знать, есть ли другой способ получить это значение в одном запросе.ORA-00979 не группа По ошибке функции

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

select emp_name,emp_location 
from Employee 
where emp_age=25 
group by emp_location 

пожалуйста, помочь в этом отношении.

Большое спасибо всем парням, которые ответили на этот вопрос. Я попытаюсь изучить эти функции окон, поскольку они очень удобны.

+0

'group by emp_location.' То, что? –

+2

«* в зависимости от возраста *» - там нет возраста колонки, ни дата столбца рождаемости в вашем примере –

+0

Iam извините, запрос «выберите emp_name, emp_location от Работника где emp_age = 25 группы по emp_location – sriramdev

ответ

2

Причина, почему это работает в MySQL, а не в Oracle, потому, что в Oracle, а также m других баз данных, вам нужно указать поле (или выражение) в предложении group by, или оно должно быть агрегацией, которая объединяет значения всех значений в группе в одну. Например, это будет работать:

select max(emp_name),emp_location 
from Employee 
where emp_age=25 
group by emp_location 

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

select max(emp_firstname), max(emp_lastname), emp_location 
from Employee 
where emp_age=25 
group by emp_location 

В решении для этого используется функция окна (аналитическая функция). С их помощью вы можете генерировать значение для каждой записи без немедленного сокращения количества записей. Например, с помощью оконной функции max вы можете выбрать максимальный возраст для людей с именем John и отобразить это значение рядом с каждым Джоном в результате, даже если у них нет такого возраста.

Некоторые функции, такие как rank, dense_rank и row_number, могут использоваться для создания номера для каждого сотрудника, который затем можно использовать для фильтрации. В приведенном ниже примере я создал такой счетчик для каждого места (раздел by by) и упорядочил по этому имени и id. Вы также можете указать другие поля, например, если вам нужно одно имя по возрасту на место, то укажите возраст и местоположение в partition by. Если вы хотите старейшего сотрудника каждого места, вы можете удалить where emp_age=25 и order by emp_age desc.

select 
    * 
from 
    (select 
    emp_name, emp_location, 
    dense_rank() over (partition by emp_location order by emp_name, emp_id) as emp_rank 
    from Employee 
    where emp_age=25) 
where 
    emp_rank = 1 
+0

Большое спасибо GolezTrol. Функция windows работала как очарование и способна получить все нужные значения из запроса. Большое спасибо еще раз. – sriramdev

2

ORA-00979 не Группировать ошибки функции

только агрегатные функции и столбцы, указанные в пункте GROUP BY разрешены в пункте SELECT.

В связи с этим Oracle внимательно следит за стандартом SQL. Но, как вы заметили в своем комментарии, некоторые другие СУБД менее строги, чем Oracle по этому вопросу. Например, чтобы цитировать MySQL's documentation (курсив мой):

MySQL расширяет применение GROUP BY так, чтобы выбрать список может относиться к неагломерированных столбцов не указанных в GROUP BY предложении. [...]

Однако это полезно, прежде всего, когда все значения в каждом неагрегированном столбце, не названном в GROUP BY, одинаковы для каждой группы. Сервер может свободно выбирать любое значение из каждой группы, поэтому , если они не совпадают, выбираемые значения являются неопределенными.

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


select emp_name,emp_location 
--  ^^^^^^^^ 
-- this is *not* part of the ̀`GROUP BY` clause 
from Employee 
where emp_state=25 
group by emp_location 

Может вы ищете:

... 
group by emp_location, emp_name 
+0

Н.О. существующее приложение работало с базой данных mysql, поэтому теперь мы не сталкивались с проблемой оракула, поэтому мы сталкиваемся с проблемой с этим запросом. – sriramdev

+0

Это потому, что MySQL глупо и в основном выбирает одно случайное имя в вашей ситуации. – GolezTrol

+0

@sriramdev MySQL поддерживает это «feature» в качестве расширения. См. мое редактирование, если вам нужно больше информации. –

0
select emp_name,emp_location 
from Employee 
where emp_age=25 
group by emp_name,emp_location 

или

select max(emp_name) emp_name,emp_location 
from Employee 
where emp_age=25 
group by emp_location 
+1

Я думаю, что 'max (emp_name)' не очень полезно, когда вы группируете 'emp_name'. – GolezTrol

+0

Это группа от * emp_location *. Это не лучшее решение, но по крайней мере это то, что @sriramdev g ot в mysql. – RubahMalam

+0

Я думал, что он сказал 'emp_name'. В любом случае, как и сейчас, второй запрос не будет работать, потому что 'emp_name' все еще находится в select в неагрегированной форме. – GolezTrol

 Смежные вопросы

  • Нет связанных вопросов^_^