분석쿼리 질문하나 드립니다. 0 2 5,014

by 강서꽃미남 분석쿼리 RANK [2012.03.07 10:41:01]



안녕하세요.

오라클클럽을 통해 공부 열심히 하고 있습니다.

쿼리 공부 중 질문하나 드립니다.


SELECT YEAR
, MONTH
, SHOP
, SUM_VAL
, LAG (SUM_VAL, 1, 0) OVER (PARTITION BY SHOP ORDER BY YEAR, MONTH) PRE_MONTH
, SUM_VAL - LAG (SUM_VAL, 1, 0) OVER (PARTITION BY SHOP ORDER BY YEAR, MONTH) AS "전월대비실적"
  FROM (SELECT YEAR
, MONTH
, SHOP
, SUM (TOT_AMT) OVER (PARTITION BY YEAR, MONTH, SHOP) SUM_VAL
, ROW_NUMBER () OVER (PARTITION BY YEAR, MONTH, SHOP ORDER BY SHOP) RN
  FROM OG_ODS_ORDER_AGGREGATION_LJJ
WHERE BASE_DATE BETWEEN '20111201' AND '20121201')
 WHERE RN = 1

와 마찬가지로 전월 대비 실적을 구하는 쿼리를 작성했는데요,
이 전월 대비 실적을 가지고 랭킹을 구하고 싶습니다.

RANK () OVER (ORDER BY SUM_VAL - LAG (SUM_VAL, 1, 0) OVER (PARTITION BY SHOP ORDER BY YEAR, MONTH)) "전월대비실적랭킹"
라고 작성을 해보니까,
"윈도우 함수를 여기에 사용할 수 없습니다." 라는 오류가 발생하네요.

1. 랭킹을 구하는 방법
2. 만약에 저런 구문은 알리어스로 주지 못하고 문장 그대로를 줘야 하나요 쿼리문
    그러니 SELECT 1번 AS "1번알리어스"
  , 2번 AS "2번알리어스" 시 1번의 AS를 통한걸로 구현을 하고 싶은경우 "1번알리어스" 라고 사용 못하고
    1번알리어스를 구현한 그 쿼리로 줘야나요? 사용할 수 있는 방법은 있나요?
by 마농 [2012.03.07 12:41:40]
1. 분석함수 중첩사용은 안됩니다.
2. Alias 는 같은 Select 내에서는 사용안됩니다.
  인라인뷰를 이용하면 안에서 정의한 별칭을 밖에서 사용은 가능하죠.
  위에서도 인라인뷰를 이용해 분석함수 두번 돌렸네요.
  마찬가지로 한번 더 감싸서 세번 돌리시면 되긴하겠죠.
3. 그러나 문제는 그게 아닙니다. 쿼리가 논리적으로 모순이 많네요.
안에서 분석함수로 합계를 구하고 rn = 1 만 가져온 부분은...
분석함수를 사용할 부분이 아니라 집계함수를 사용했어야 하는 부분입니다.
SELECT year, month, shop
     , SUM(tot_amt) sum_amt
  FROM og_ods_order_aggregation_ljj
 WHERE base_date BETWEEN '20111201' AND '20121201'
 GROUP BY year, month, shop
;
4. 분석함수안에서 집계함수 사용이 가능하므로 서브쿼리를 좀 줄여보겠습니다.
SELECT year, month, shop
     , sum_val
     , pre_month
     , sum_val - pre_month "전월대비실적"
     , RANK() OVER(ORDER BY sum_val - pre_month DESC) rk
  FROM (SELECT year, month, shop
             , SUM(tot_amt) sum_val
             , LAG(SUM(tot_amt)) OVER(PARTITION BY shop ORDER BY year, month) pre_month
          FROM og_ods_order_aggregation_ljj
         WHERE base_date BETWEEN '20111201' AND '20121201'
         GROUP BY year, month, shop
        )
;

by 강서꽃미남 [2012.03.07 12:55:53]

마농님 답변 감사드립니다. 많이 배워가겠습니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입