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