ORA-00979 표현에 의한 그룹이 아닙니다


147

다음 쿼리로 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 절이 모두있는 예제를 찾을 수 없습니다. 한 번에 하나씩 그룹에서 각 필드를 제거하려고 시도했지만 여전히 동일한 오류가 발생합니다.

답변:


232

당신은 모든 열을 삽입해야 SELECT에서 GROUP BY또는 (같은 단일 값으로 결과를 압축 그들에 기능 사용 MIN, MAX또는 SUM).

왜 이런 일이 발생하는지 이해하는 간단한 예 : 다음과 같은 데이터베이스가 있다고 상상해보십시오.

FOO BAR
0   A
0   B

그리고 당신은 실행 SELECT * FROM table GROUP BY foo합니다. 즉, 데이터베이스는 첫 번째 열과 함께 단일 행을 반환하여 결과 0를 충족시켜야 GROUP BY하지만 이제 두 가지 값 중에서 bar선택할 수 있습니다. 어떤 결과는 기대 - AB? 또는 GROUP BY? 의 계약을 위반하여 데이터베이스가 둘 이상의 행을 반환해야 합니까?


7
아니요, 귀하는 주문에 따라 주문할 필요가 없습니다
Xaisoft

3
ORDER BY의 두 열을 GROUP BY에 추가하려고했습니다. 효과가있었습니다. 감사!
Theresa

1
또는 달리 말하면 : 두 개의 열이 있고 첫 번째 열로 그룹화하면 결과 행 당 두 번째 열의 여러 값이 있음을 의미합니다. 단일 결과 행만 있지만 선택할 수있는 값이 많으므로 DB는 어떤 것을 반환해야합니까? 처음 넘어 지는가?
Aaron Digulla

6
@AaronDigulla 이것이 MySQL이하는 일이고, 세상은 끝나지 않았습니다 : p
Chris Baker

1
부분적으로 동의합니다. 그러나 다음과 같은 경우를 가정하십시오. A, B, C 및 D의 4 개 열이 있습니다. 이제 (A, B, C)를 복합 키로 설정했습니다. 그런 다음 "select A, B, max (C), D ... group by A, B"는 A, B와 C의 각 조합에 대해 D가 이미 정의되어 있기 때문에 모호하지 않습니다. 여전히 오라클은 그 일을 거부합니다.
ga

17

그룹 함수 인수가 아닌 GROUP BY모든 SELECT표현식을 절에 포함하십시오 .


9

너무 나쁜 오라클에는 이와 같은 제한이 있습니다. 물론 GROUP BY에없는 열의 결과는 임의적이지만 때로는 원할 수도 있습니다. Silly Oracle, MySQL / MSSQL에서이 작업을 수행 할 수 있습니다.

그러나 Oracle에 대한 해결 방법이 있습니다.

다음 줄이 작동하지 않는 동안

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

다음과 같은 0으로 Oracle을 속여서 열의 범위를 유지하지만 그룹별로 묶을 수는 없습니다 (숫자라고 가정하면 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);

@ 의사 테이블이 위에서 엄격하게 정의되어 있지 않고 11g를 가진 회사에서 더 이상 일하지 않는다는 점을 감안할 때 @GlennFromIowa는 더 나은 예제를 제공 할 수 없지만 마지막으로 테스트했을 때 문제가되었습니다.
Joseph Lust

4
호기심 때문에 무작위 결과를 원할 때의 예는 무엇입니까? FOO별로 그룹화하고 BAR에 대한 임의의 행을 얻으려는 이유를 생각할 수 없습니다.
Kyle Bridenstine

4

당신이 포함의 미덕에 의해 그룹화하는 경우 GROUP BY절에서 표현식 SELECT그룹 기능 (또는 집계 함수 또는 집계 열)과 같은 아니며, COUNT, AVG, MIN, MAX, SUM등 (에 집계 함수의 목록 )에 존재한다 GROUP BY절.

예 (올바른 방법) (여기서는 employee_id그룹 함수 (비 집계 열)가 없으므로에 표시 되어야합니다GROUP BY . 대조적으로 sum (salary)는 그룹 함수 (집계 열)이므로 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절 에서 그룹 (집계) 기능을 제거하십시오 .

2

다음을 수행해야합니다.

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;

1

UPPER 또는 LOWER 키워드가 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) .

1

그룹화 기준은 집계 함수에 따라 일부 데이터를 집계하는 데 사용되며 그룹화가 필요한 열을 넣어야합니다.

예를 들면 다음과 같습니다.

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

이로 인해 부서에 최대 급여가 부과됩니다.

이제 d.deptnofrom group by 절을 생략 하면 동일한 오류가 발생합니다.


1

다른 답변 외에도 order by 절에 불일치가 있으면이 오류가 발생할 수 있습니다. 예를 들어 :

select 
    substr(year_month, 1, 4)
    ,count(*) as tot
from
    schema.tbl
group by
    substr(year_month, 1, 4)
order by
    year_month
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.