티스토리 툴바



2011/03/29 10:54

오라클 PARTITION BY 구문

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 CNT FROM DUAL UNION ALL
    SELECT 'B' GRADE, 30 CNT FROM DUAL UNION ALL
    SELECT 'D' GRADE, 15 CNT FROM DUAL UNION ALL
    SELECT 'F' GRADE, 10 CNT FROM DUAL
)
SELECT /* 표현식 OVER (PARTITION BY 컬럼1 ORDER BY 컬럼2) :
           컬럼1값이 같은것들로 묶은것을 컬럼2로 정렬하여 각 파티션별로 뿌려줌*/
    GRADE 등급,
    CNT 학생수,
    SUM(CNT) OVER() 갯수,
    ROW_NUMBER() OVER (PARTITION BY GRADE ORDER BY CNT) 로넘,
    RANK() OVER(PARTITION BY GRADE ORDER BY CNT) 랭크,
    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) 누적구성비,
    COUNT(*) OVER () 전체행카운트,
    COUNT(*) OVER (PARTITION BY GRADE) 그룹단위카운트,
    ROUND((CNT/SUM(CNT) OVER())*100,2) 전체대비구성비_1,
    ROUND(RATIO_TO_REPORT(CNT) OVER() * 100,2) 전체대비구성비_2, --현재행값/SUM(전체행값) 구성비
    ROUND((CNT/SUM(CNT) OVER(PARTITION BY GRADE))*100,2) 그룹대비구성비_1,
    ROUND(RATIO_TO_REPORT(CNT) OVER(PARTITION BY GRADE) * 100,2) 그룹대비구성비_2 --현재행값/SUM(그룹행값) 구성비
FROM TEST;

 

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License

'SQL' 카테고리의 다른 글

오라클 PARTITION BY 구문  (0) 2011/03/29
MSSQL 2000 페이지 처리  (0) 2009/08/19
Trackback 0 Comment 0