다음 쿼리로 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 절이 모두있는 예제를 찾을 수 없습니다. 한 번에 하나씩 그룹에서 각 필드를 제거하려고 시도했지만 여전히 동일한 오류가 발생합니다.
답변
당신은 모든 열을 삽입해야 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
표현식을 절에 포함하십시오 .
답변
너무 나쁜 오라클에는 이와 같은 제한이 있습니다. 물론 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);
답변
당신이 포함의 미덕에 의해 그룹화하는 경우 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
절 에서 그룹 (집계) 기능을 제거하십시오 .
답변
다음을 수행해야합니다.
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;
답변
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) .
답변
그룹화 기준은 집계 함수에 따라 일부 데이터를 집계하는 데 사용되며 그룹화가 필요한 열을 넣어야합니다.
예를 들면 다음과 같습니다.
select d.deptno, max(e.sal)
from emp e, dept d
where e.deptno = d.deptno
group by d.deptno;
이로 인해 부서에 최대 급여가 부과됩니다.
이제 d.deptno
from group by 절을 생략 하면 동일한 오류가 발생합니다.