Oracle OVER 명령어

쿼리 작업을 하다보면 SELECT 절에서 COUNT() 값을 같이 조회해서 내보내고자 할때가 있다.

이전에는 다음과 같이 서브쿼리를 사용해서 작성했었다.

  SELECT TITLE,
         (
           SELECT COUNT(*)
             FROM T_TEST_ONE
         )
    FROM T_TEST_TWO

그런데 오라클에서는 좀 더 간단하게 표현하는 방법이 있었다.

바로 OVER() 함수다.

OVER 함수는

  • GROUP BY 또는 ORDER BY 와 같이 그룹 조회를 할때 이용되는 서브쿼리를 개선하기 위해 나온 함수이다.
  • COUNT(), SUM(), AVG(), RANK(), ROW_NUMBER() 등의 집계함수 또는 분석함수와 같이 사용된다.

아래는 일반적으로 발생할 수 있는 오류 상황이다.

  SELECT COL_ONE,
         COUNT(*)
    FROM T_TEST_ONE

무엇이 잘못되었을까?

COUNT() 함수는 집계함수다. 즉, 전체를 그룹으로 하거나 특정 Column 을 그룹으로 만들어 사용할 수 있다.

위에 코드에서는 COL_ONE 이라는 Column 과 테이블 전체를 그룹으로 하는 COUNT 함수를 조회하고 있다.

즉, 집계함수를 사용하는 SELECT 문에서는 GROUP BY 로 지정되어 있지 않은 Column 을 조회할 수 없다.

만일 COL_ONE 이라는 Column 을 조회하고 싶으면 다음과 같이 작성해야 한다.

  SELECT COL_ONE,
         COUNT(*)
    FROM T_TEST_ONE
   GROUP BY COL_ONE

자, 확인해보자!

실행결과는 오류없이 나오는것 같다. 하지만 문제는 GROUP BY 로 묶여진 COL_ONE 별 COUNT() 함수의 값이 집계 된다는 것이다.

내가 원하는 것은 COUNT() 함수는 전체의 값을 COL_ONE 은 각각의 값을 내보내는 것이었다.

그래서 사용할 수 있는 것이 서브쿼리! 또는 OVER() 함수이다

OVER() 함수의 사용법은 간단하다.

  # COL_ONE 과 테이블 전체의 COUNT() 값 조회
  SELECT COL_ONE
         COUNT(*) OVER()
    FROM T_TEST_ONE

  # 중복 제외
  SELECT COL_ONE
         COUNT(*) OVER(DISTINCT COL_TWO)
    FROM T_TEST_ONE

  # COL_TWO 정렬 
  SELECT COL_ONE
         COUNT(*) OVER(ORDER BY COL_TWO)
    FROM T_TEST_ONE

  # GROUP BY
  SELECT COL_ONE
         COUNT(*) OVER(PARTITION BY COL_THREE)
    FROM T_TEST_ONE

서브쿼리 사용도 좋지만 OVER() 함수와 같이 사용하기 편한 표현도 사용해보자.

태그: ,

카테고리:

업데이트:

댓글남기기