2014-01-27 3 views
0

Я создал таблицу и попытался узнать, как использовать группу по запросу, но ее дающий странный вывод.Группа по запросу в mysql и oracle

create table student(bid char(3), sname varchar(15), totfee float, feepaid float, 
    feebal float, branch char(3), city char(4)); 


insert into student values(101,'student1',16000,8000,8000,'mat','bang'); 
insert into student values(102,'student2',17000,8000,9000,'mar','bang'); 
insert into student values(103,'student3',16000,9000,7000,'btm','bang'); 
insert into student values(104,'student4',12000,8000,4000,'amr','hyde'); 
insert into student values(105,'student5',14000,6000,8000,'mat','bang'); 
insert into student values(106,'student6',18000,8000,10000,'mar','bang'); 
insert into student values(107,'student7',16000,4000,12000,'btm','bang'); 
insert into student values(108,'student8',11000,2000,9000,'amr','bang'); 
insert into student values(109,'student9',13000,5000,8000,'btm','bang'); 
insert into student values(110,'student10',16000,3000,13000,'amr','hyde'); 

Теперь я пытаюсь сортировать студентов по отраслям. Для этого я попробовал следующий запрос

В Oracle

select * from student group by branch; 

выход

error- не group by выражение

В Mysql

выход:

+------+-----------+--------+---------+--------+--------+------+ 
    | bid | sname  | totfee | feepaid | feebal | branch | city | 
    +------+-----------+--------+---------+--------+--------+------+ 
    | 104 | student4 | 12000 | 8000 | 4000 | amr | hyde | 
    | 103 | student3 | 16000 | 9000 | 7000 | btm | bang | 
    | 113 | student13 | 36000 | 18000 | 18000 | mal | bang | 
    | 102 | student2 | 17000 | 8000 | 9000 | mar | bang | 
    | 101 | student1 | 16000 | 8000 | 8000 | mat | bang | 
    +------+-----------+--------+---------+--------+--------+------+ 

На самом деле я ожидал, что все это сгруппируют всех студентов по отрасли .. Так как мне это сделать? и каково фактически использование группы по запросу? Я даже пробовал ссылаться с сайта, как w3school, и tpoint. Но не мог понять.

+0

Предложение GROUP BY заявление используется в сочетании с агрегатными функциями для группировки множества результатов с помощью одного или более столбцов –

+0

MySQL имеет очень неаккуратно реализацию оператора 'group by' (не сказать сломанного). Смотрите это: http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html и это: http://www.mysqlperformanceblog.com/2006/09/06/wrong-group-by -makes-your-queries-fragile/для получения дополнительной информации –

+0

Для оракула вам нужно использовать функцию агрегата для использования предложения group by. – Sadikhasan

ответ

3

Группа имеет смысл только при использовании вместе с другими функциями агрегации, такими как sum() или другими. Эти функции агрегации объединяют значения нескольких строк столбца. Например sum() вычисляет сумму всех значений указанного столбца. В вашем примере эти столбцы могут быть totfee или feepaid. Но это вычисляет сумму всех строк, если вы хотите, чтобы сумма для каждой отдельной ветви вычислялась, вы можете использовать предложение group by в столбце ветки. Теперь ваша база данных вычисляет функции агрегации по строкам, которые имеют одинаковое значение ветвления , и результат содержит то же количество строк, что и в вашей таблице, есть разные значения для branch.

2

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

Кроме того, GROUP BY используется для группировки записей (агрегатов). Для сортировки результатов вы должны использовать ORDER BY.

0

«группа по ветке» вернет все разные значения для поля «ветвь». Если вы хотите заказать студентов на основе поля «branch», вы должны использовать «заказать по ветви ASC» (или DESC).

0

Как вы сказали, что хотите Сортировка учеников, основанных на ветке, Вместо того, чтобы использовать «группу по», вы можете использовать «заказать».

select * from student order by branch; 
0

В оракула Вы можете использовать этот запрос, чтобы получить окончательный результат:

with Tab AS (SELECT min(BID) AS ID FROM STUDENT GROUP BY BRANCH) 
SELECT * FROM STUDENT WHERE BID IN (SELECT ID FROM Tab); 
0

В Oracle вы должны назвать каждый столбец, который используется в группе выражения в операторе отбора и если вы используйте * в своем выражении select, вы должны называть все ваши столбцы в группе выражением: выберите * from student s group by s.bid, s.sname, s.totfee, s.feepaid, s.feebal, s .branch, s.city , который не является реальной группировкой и над запросом, означает выбор * от ученика, и никакая группировка действительно не выполняется. вы можете иметь такие запросы в Oracle:

максимальное totfee в каждой отрасли:

select s.branch,max(s.totfee) from student s group by s.branch 

в этом запросе оракула групп всех данных в соответствии с их ветвей. группировка на основе ветви означает, что вы должны иметь только 1 запись для каждой ветви, например, «amr» на вашем выходе, обычно у вас есть 3 записи для branch'amr ', поэтому вам нужно сделать некоторые работы, чтобы удалить лишние строки, и вы должны указать oracle какие строки должны быть удалены и какие из них должны быть оставлены, и это является причиной существования max (s.totfee), с максимальной функцией, вы говорите, что оракул должен содержать только строку, которая имеет максимальный уровень totfee и удалять другие, теперь вы можете 1 выходная запись для каждой ветви.

Подсказка: если вы хотите указать условие, вы должны использовать «наличие» вместо того, где находится запрос.

количество ветвей, которые имеют более 2 студентов:

select s.branch,count(*) from student s group by s.branch having count(*)>2 
+0

Благодарим вас за объяснение .. особенно для второго запроса .. – User27854

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