2009-10-05 1 views
96

Я получаю ORA-00979 с помощью следующего запроса:ORA-00979 не группа выражения

SELECT cr.review_sk, cr.cs_sk, cr.full_name, 
tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt", 
cs.cs_id, cr.tracking_number 
from review cr, cs, fact cf 
where cr.cs_sk = cs.cs_sk 
and UPPER(cs.cs_id) like '%' || UPPER(i_cs_id) || '%' 
and row_delete_date_time is null 
and cr.review_sk = cf.review_wk (+) 
and cr.fact_type_code (+) = 183050 
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number 
ORDER BY cs.cs_id, cr.full_name; 

Я не мог найти какие-либо примеров, которые имели как GROUP BY и ORDER BY пунктов в том же запросе. Я попытался удалить каждое поле из группы по одному, но я все равно получаю ту же ошибку.

ответ

166

Вы должны поместить все столбцы SELECT в GROUP BY или использовании функций на них, которые сжимают результаты в одно значение (например, MIN, MAX или SUM).

Простой пример, чтобы понять, почему это происходит: Представьте, у вас есть база данных, как это:

FOO BAR 
0 A 
0 B 

и запуске SELECT * FROM table GROUP BY foo. Это означает, что база данных должна возвращать одну строку в качестве результата с первым столбцом 0 для выполнения GROUP BY, но теперь есть два значения bar. Какой результат вы ожидаете - A или B? Или должна ли база данных возвращать более одной строки, нарушая договор GROUP BY?

+0

Даже те, которые содержатся в предложении ORDER BY? У меня нет этих двух в моей группе. – Theresa

+6

Нет, вам не нужно помещать их в ваш заказ по предложению – Xaisoft

+2

Я попытался добавить два столбца в ORDER BY к GROUP BY. Это сработало. Благодаря! – Theresa

13

Включить в текст GROUP BY все SELECT выражения, которые не являются аргументами групповой функции.

2

Слишком плохо, что Oracle имеет такие ограничения. Конечно, результат для столбца, не входящего в GROUP BY, будет случайным, но иногда вы этого хотите. Глупый Oracle, вы можете сделать это в MySQL/MSSQL.

НО есть работа вокруг для Oracle:

Хотя следующая строка не работает

SELECT unique_id_col, COUNT(1) AS cnt FROM yourTable GROUP BY col_A; 

Вы можете обмануть Oracle с некоторыми 0 ', как в следующем, чтобы сохранить вашу колонку в объеме , но не группируются им (при условии, что они являются числами, в противном случае используется CONCAT)

SELECT MAX(unique_id_col) AS unique_id_col, COUNT(1) AS cnt 
FROM yourTable GROUP BY col_A, (unique_id_col*0 + col_A); 
+0

@GlennFromIowa, учитывая, что моя псевдо-таблица строго не определена выше, и что я больше не работаю для фирмы с 11g, я не могу представить лучший пример, хотя это была проблема, когда я в последний раз ее тестировал. –

+1

Просто из любопытства, что является примером того, когда вам нужен случайный результат? Я не могу думать о какой-либо причине, которую вы хотели бы группировать по FOO и получить случайную строку для BAR. –

1

Группа, используемая для агрегирования me, в зависимости от агрегатной функции, и кроме этого вам нужно поставить столбец или столбцы, для которых вам нужна группировка.

, например:

select d.deptno, max(e.sal) from emp e, dept d where e.deptno = d.deptno group by d.deptno;

Это приведет в департаментах максимальной заработной платы.

Теперь, если мы опустим предложение d.deptno из group by, оно даст ту же ошибку.

1

Вы должны сделать следующее:

SELECT cr.review_sk, 
     cr.cs_sk, 
     cr.full_name, 
     tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt", 
     cs.cs_id, 
     cr.tracking_number 
from review cr, cs, fact cf 
where cr.cs_sk = cs.cs_sk 
     and UPPER(cs.cs_id) like '%' || UPPER(i_cs_id) || '%' 
     and row_delete_date_time is null 
     and cr.review_sk = cf.review_wk (+) 
     and cr.fact_type_code (+) = 183050 
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number, cs.cs_id, cr.full_name 
ORDER BY cs.cs_id, cr.full_name; 
0

же ошибка также приходит, когда ВЕРХНИХ или НИЖНЕГО ключевого слова не используется и в месте выбора выражения и группе экспрессии.

Неправильно: -

select a , count(*) from my_table group by UPPER(a) . 

Справа: -

select UPPER(a) , count(*) from my_table group by UPPER(a) . 
1

Если вы ощупью в силу в том числе GROUP BY положение, любое выражение в SELECT, которая не является функцией группы (или агрегатная функция или агрегированная колонна), такие как COUNT, AVG, MIN, MAX, SUM и т. Д. (List of Aggregate functions) должны быть представлены в статье GROUP BY.

Пример (правильный способ) (здесь employee_id не функциональная группа (неагрегированный столбец), так это обязательно появляется в GROUP BY. В отличии от этого, суммы (заработная плата) является функцией группы (агрегируются колонок), так что не требуется появляться в пункте GROUP BY.

SELECT employee_id, sum(salary) 
    FROM employees 
    GROUP BY employee_id; 

Пример (неправильный путь) (здесь employee_id не функциональная группа и она не появляется в GROUP BY пункта, что приведет к ORA-00979 Ошибка.

SELECT employee_id, sum(salary) 
    FROM employees; 

Для исправления вам нужно сделать один из следующих действий:

  • Включить все необобщенное выражение, перечисленное в SELECT пункте в предложении GROUP BY функция
  • Удалить группу (складочном) от SELECT статья.