유용한 SQL – 스크립 중..

over() 함수

WITH TEST AS
(
    select 'A' grade, 10 cnt from dual union all 
    select 'A' grade, 20 cnt from dual union all
    select 'A' grade, 15 cnt from dual union all  
    select 'B' grade, 20  from dual union all 
    select 'B' grade, 30  from dual union all 
    select 'D' grade, 15  from dual union all 
    select 'F' grade, 10  from dual
)
SELECT
    grade 등급, 
    cnt 학생수, 
    sum(cnt) over () 갯수,
    row_number() over(partition by grade order by cnt) 로넘,
    rank() over(partition by grade order by cnt) 랭크,
    round((cnt / sum(cnt) over ())*100,2) 구성비, 
    sum(cnt) over (partition by grade  order by grade) 누적학생수,
    sum(cnt) over (partition by grade,cnt  order by grade) 그레카운, 
    sum(cnt) over (order by grade) 누적,
    round((sum(cnt) over (order by grade)/sum(cnt) over ())*100,2) 누적구성비
FROM TEST;
      학생수       갯수       로넘       랭크     구성비 누적학생수   그레카운       누적 누적구성비
- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
A         10        120          1          1       8.33         45         10         45       37.5
A         15        120          2          2       12.5         45         15         45       37.5
A         20        120          3          3      16.67         45         20         45       37.5
B         20        120          1          1      16.67         50         20         95      79.17
B         30        120          2          2         25         50         30         95      79.17
D         15        120          1          1       12.5         15         15        110      91.67
F         10        120          1          1       8.33         10         10        120        100

표현식 over (partition by 컬럼1 order by 컬럼2)

==>

(컬럼1값이 같은놈들로 묶은것을 컬럼2로 정렬한) 각 파티션별로 표현식을 수행해준다.

출처 : http://blog.naver.com/18061975/10018995745

순번뽑기

한마디로 요약해서 순번을 뽑아 내는 건데요
순번컬럼

001
002
004
000 <--- 없는 필드
000 <--- 없는 필드
005
000 <--- 없는 필드
100

이렇게 레코드셋이 나온다면
없는 필드엔 차례대로
가장 큰 순번+1 그러니깐

001
002
004
101
102
005
103
100

이런식으로 select 절에서 나오길 원하는데 방법이 있을까요?

SELECT DECODE(순번, '000', MAX(순번) OVER() + rn, 순번) AS 순번
FROM(
SELECT 순번
, ROW_NUMBER() OVER(ORDER BY 순번, ROWNUM) AS rn
, ROW_NUMBER() OVER(ORDER BY ROWNUM) AS org_rn
FROM t
)
ORDER BY org_rn

출처 : http://database.sarang.net/?inc=read&aid=34045&criteria=oracle&subcrit=qna&id=&limit=20&keyword=&page=1

Notice

  • 이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용할 수 있습니다. 크리에이티브 커먼즈 라이선스
  • 저작권과 관련된 파일요청 및 작업요청을 받지 않습니다.
  • 댓글에 대한 답변은 늦을 수도 있습니다.
  • 답글 남기기

    이매일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다