2014년 6월 25일 수요일

[초보자를위한오라클자바커뮤니티SQL교육,오라클SQL함수,SQL교육,SQL학원,구로디지털단지 오라클교육학원]first_value, last_value를 이용하기 , 오라클자바커뮤니티 오프라인 교육센터

[초보자를위한오라클자바커뮤니티SQL교육,오라클SQL함수,SQL교육,SQL학원,구로디지털단지 오라클교육학원]first_value, last_value를 이용하기 , 오라클자바커뮤니티 오프라인 교육센터

다음과 같은 집계가 필요하다고 가정을 해보겠습니다.

월별로 상품에 대한 판매 금액의 누계가 있다고 했을 때 월별 총 판매액을 구하면서 같은 행에 이전달과 다음달의 판매량의 합계를 같이 보여야 한다고 했을 때…

이러한 경우엔 first_value, last_value를 이용하면 쉽게 구할 수 있습니다.

이 두 가지는 집합 함수이며 오라클에서 추가로 제공된 겁니다.

아마도 집계 데이터를 비교해서 볼 때 유용하게 이용 될 수 있을 것 같습니다.

아래의 예제를 통해 이해해 보도록 하죠~

우선 sales 하는 테이블을 하나 만드세요…

생긴 것은 아래와 같습니다.

SQL> desc sales;
 이름                                      널?      유형
 ----------------------------------------- -------- ------------

 YYYYMM                                            VARCHAR2(6)
 PROD_ID                                            NUMBER(2)
 SALE                                              NUMBER(5)

그리고 데이터는 다음과 같이 넣어 보세요..


SQL> select * from sales;

YYYYMM    PROD_ID      SALE
------ ---------- ----------
200401          1      1000
200401          2      2000
200401          3      3000
200402          1      1000
200402          2      2000
200403          1      1000
200403          3      3000
200404          1      1000

sale이라는 컬럼은 판매금액을 가진 다고 했을 때(단위는 편의상 원이라고 하구요)

데이터를 보면 1월에 1번 상품을 1000원, 2번 상품을 2000, 3번 상품을 3000, 뭐 이런식으로 데이터가 들어가 있는데 월별 집계 데이터(판매량의 합계)가 필요하면서 이전달과 다음달의 판매 합계가 같이 보일 수 있도록(하나의 행에) 구성을 하자는 겁니다.

다음과 같이 질의 해 보세요…


select yyyymm,
    first_value(sum(sale)) over (order by yyyymm rows between 1 preceding and 1 following) prev_month,
    sum(sale) monthly_sales,
    last_value(sum(sale)) over (order by yyyymm rows between 1 preceding and 1 following) next_month
  from sales
  group by yyyymm
order by yyyymm

[결과]
YYYYMM  PREV_MONTH  MONTHLY_SALES  NEXT_MONTH
------ ---------- ------------- ---------------------
200401        6000                6000          3000
200402        6000                3000          4000
200403        3000                4000          1000
200404        4000                1000          1000

위에서 1월과 12월은 이전달과 다음달이 없으므로 그 달이 두번 계산된 것처럼 출력 되었습니다.

1월인 경우 이전달과 그달의 값이 같고, 12월인 경우엔 다음달과 12월의 합계가 같습니다.

혹시 이 부분에서 이전달이 없거나 이후의 달이 없는 데이터인 경우 처리하는 방법을 알고 계신 분은 리플 달아 주세요…

1월인 경우 이전 달이 0으로 12월인 경우 다음달이 0으로 나오면 좋을 텐데…

아래처럼 결과가 나오게요~

YYYYMM  PREV_MONTH  MONTHLY_SALES  NEXT_MONTH
------ ---------- ------------- ---------------------
200401          0                6000          3000
200402        6000                3000          4000
200403        3000                4000          1000
200404        4000                1000              0

오라클자바커뮤니티교육센터, 개발자전문교육, 개인80%환급
www.oraclejavacommunity.com


평일주간(9:30~18:10) 개강
(6/30)[기업100%환급]PL/SQL,ORACLE HINT,TUNING[개강확정]
(6/30)[기업100%환급]안드로이드개발자과정[개강확정]
(6/30)[기업100%환급]SQL기초에서 Schema Object까지[개강확정]
(7/07)[기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍
(7/07)[기업100%환급]Spring ,MyBatis,Hibernate실무과정[개강확정]
(7/07)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 
(7/07)[채용예정교육]오라클자바개발잘하는신입뽑기프로젝트,교육전취업확정

평일야간(19:00~21:50) 개강
(6/26)SQL초보에서실전전문가까지[개강확정]
(7/01)안드로이드개발자과정[개강확정]
(7/01)닷넷(C#,Network,ADO.NET,ASP.NET)마스터과정
(7/02)Spring3.X, MyBatis, Hibernate실무과정[개강확정]
(7/02)자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
(7/02)JAVA,Network&WEB&Framework(자바기초에서웹스프링까지)
(7/03)웹퍼블리싱 마스터
(7/15)MyBatis3.X, Hibernate4.X ORM실무과정
(7/22)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지

주말(10:00~17:50) 개강
(6/28)Spring3.X, MyBatis, Hibernate실무과정[개강확정]
(6/28)안드로이드개발자과정
(6/29)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지[개강확정]
(7/05)SQL초보에서 Schema Object까지
(7/12)자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
(7/12)MyBatis3.X, Hibernate4.X ORM실무과정
(7/12)개발자를위한PLSQL,SQL튜닝,힌트
(7/12)실무예제로 배워보는 jQuery(개발자/디자이너를위한)
(7/13)C#,ASP.NET마스터

주말저녁(18:30~22:20) 개강
(6/28)JAVA,Network&WEB&Framework
(6/28)SQL기초에서실무까지

댓글 없음:

댓글 쓰기