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 в одном запросе. Я попытался удалить каждое поле из группы по одному за раз, но все равно получаю ту же ошибку.

7 ответов


вы должны поместить все столбцы 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?


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


слишком плохо 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);

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

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;

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

пример (правильный способ) (здесь employee_id не является групповой функцией (неагрегированный столбец), поэтому это должны явиться в GROUP BY. От напротив, sum (зарплата) - это групповая функция (агрегированный столбец), поэтому она не должна отображаться в 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 п.
  • удалить функцию group (aggregate) из SELECT предложения.

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

например:

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

в результате в отделы максимальную зарплату.

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


такая же ошибка также приходит, когда верхний или ниже ключевое слово не используется в обоих местах в select expression и group BY expression .

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

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

право :-

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