programing

식에 의한 그룹이 아닌 ORA-00979

nicescript 2023. 2. 15. 22:30
반응형

식에 의한 그룹이 아닌 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 절이 모두 있는 예를 찾을 수 없었습니다.그룹에서 각 필드를 하나씩 삭제하려고 했지만 여전히 동일한 오류가 발생합니다.

하다의 모든 은 다 돼요.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 all 든 SELECT을 사용법

Oracle에는 다음과 같은 제한이 있습니다.물론 GROUP BY에 포함되지 않은 열에 대한 결과는 랜덤이지만 때로는 이 결과를 원할 수도 있습니다.바보 같은 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(에 sum(salary)은 abgregated column(집계열)에 표시할 필요가 없습니다.GROUP BY

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

예(잘못된 방법)(여기서)employee_id, 기능에는 .GROUP BYORA-00979 - or or or or or or or or or or or or or or or or 。

   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;

select expression과 group by expression의 양쪽에서 UPER 또는 LOWER 키워드가 사용되지 않은 경우에도 동일한 오류가 발생합니다.

틀렸다:-

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

오른쪽:-

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

이 오류는 다른 응답과 더불어 절별 주문에 불일치가 있는 경우 발생할 수 있습니다.예:

select 
    substr(year_month, 1, 4)
    ,count(*) as tot
from
    schema.tbl
group by
    substr(year_month, 1, 4)
order by
    year_month

각 그룹의 랜덤 행에 관한 @Joseph Lust의 답변에 대한 대체 솔루션을 추가합니다.는 Oracle Database 19c 이상에서 다음을 사용하여 가능합니다.any_value키워드를 지정합니다.다음은 예를 제시하겠습니다.

select customer_id,
       max ( order_datetime ),
       any_value ( store_id ),
       any_value ( order_status ),
       any_value ( order_id )
from   co.orders
group  by customer_id;

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

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

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

이로 인해 부서별 최대 급여가 발생합니다.

여기서 생략하면d.deptno그룹별로 같은 에러가 발생합니다.

"Aaron Digulla" (이 시점에서는 첫 번째)의 답변은 Spring Boot 2 (JPA/Hibernate)와 CriteriaQuery/CriteriaBuilder를 사용한 동일한 에러 코드에 대한 솔루션에 영감을 주었습니다.

선택 목록을 작성하여 criteriaQuery.multiselect()에 추가합니다.

List<Selection> selects = new ArrayList<>();
    selects.add(seccionRoot.get("id"));
    selects.add(synSeccionRoot.get("DDF"));
    selects.add(synSeccionRoot.get("TTYU"));
    selects.add(synSeccionRoot.get("4567"));
    selects.add(seccionRoot.get("22").get("223"));
    selects.add(tasaRoot.get("price"));
    selects.add(tasaRoot.get("chair"));

    cq.multiselect(selects.toArray(Selection[]::new));

그런 다음 목록을 식[]에 캐스팅할 수 있습니다.

cq.groupBy(selects.toArray(Expression[]::new));

언급URL : https://stackoverflow.com/questions/1520608/ora-00979-not-a-group-by-expression

반응형