database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 31519 게시물 읽기
No. 31519
매출 쿼리 질문 입니다.
작성자
김상태(ecolekorea)
작성일
2007-08-01 19:02
조회수
1,957

흠 너무 CASE문의남발이 아닌지 모르겟어서 한번 여러분께 이렇게 쿼리를 해도 되는지 

여쭤보고 싶어서 글을 올려봅니다. 


 구분, 전월값, 해당년의 1월~전월값, 전월대비전전월값, 전년동월비(예:2007년7월대비2006년7월), 

  전년동기비(예:2007년1월~7월대비2006년1월~7월)


 이렇게 나오는 쿼리입니다.


 이게 공식이 맞는건지 도무지 헤깔려서요. 


 고수님들이 도움 부탁드립니다.




select nvl(c.yebid1,b.itcls) 구분,

         sum(decode(a.sales_yymm,to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyymm'),a.sales_amt,0)) 전월,

         sum(decode(substr(a.sales_yymm,1,4), 

                substr(to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyymm'),1,4),a.sales_amt)) 당년월,

        /* 전월비 */

       CASE WHEN

        sum(decode(a.sales_yymm,to_char(add_months(to_date(:arg_yymm,'yyyymm'),-2),'yyyymm'),a.sales_amt,0))= 0 THEN 0

       ELSE

        round(100*(sum(decode(a.sales_yymm,to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyymm'),a.sales_amt,0))-

       sum(decode(a.sales_yymm,to_char(add_months(to_date(:arg_yymm,'yyyymm'),-2),'yyyymm'),a.sales_amt,0)))/

       sum(decode(a.sales_yymm,to_char(add_months(to_date(:arg_yymm,'yyyymm'),-2),'yyyymm'),a.sales_amt,0)))

       END||'%' 전월비,

      /* 전년동월비*/

       CASE WHEN

       sum(decode(a.sales_yymm,to_char(add_months(to_date(:arg_yymm,'yyyymm'),-13),'yyyymm'),a.sales_amt,0)) = 0 THEN 0

       ELSE

       round(100*(sum(decode(a.sales_yymm,to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyymm'),a.sales_amt,0))-

       sum(decode(a.sales_yymm,to_char(add_months(to_date(:arg_yymm,'yyyymm'),-13),'yyyymm'),a.sales_amt,0)))/

       sum(decode(a.sales_yymm,to_char(add_months(to_date(:arg_yymm,'yyyymm'),-13),'yyyymm'),a.sales_amt,0)))

       END||'%' 전년동월비,   

      /* 전년 동기비 */

     NVL(CASE WHEN 

      sum(CASE WHEN ( to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyy')-1||'01'  <= a.sales_yymm) THEN

      (CASE WHEN (to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyy')-1

      ||substr(to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyymm'),-2) >= a.sales_yymm) THEN a.sales_amt ELSE 0 END)

      ELSE 0 END) = 0 THEN 0

    ELSE

    round(100*(sum(decode(substr(a.sales_yymm,1,4), 

      substr(to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyymm'),1,4),a.sales_amt)) -

     sum(CASE WHEN ( to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyy')-1||'01'  <= a.sales_yymm) THEN

      (CASE WHEN (to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyy')-1

      ||substr(to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyymm'),-2) >= a.sales_yymm) THEN a.sales_amt ELSE 0 END)

      ELSE 0 END))/

     sum(CASE WHEN ( to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyy')-1||'01'  <= a.sales_yymm) THEN

      (CASE WHEN (to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyy')-1

      ||substr(to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyymm'),-2) >= a.sales_yymm) THEN a.sales_amt ELSE 0 END)

      ELSE 0 END))

    END,0)||'%' 전년동기비

from salesum a, itemas b, itnct c

where a.sabu = b.sabu

and a.itnbr = b.itnbr

and b.ittyp = c.ittyp

and b.itcls = c.itcls

and c.lmsgu ='S'

and a.sabu ='1'

and b.ittyp in ('1','6')

and substr(c.itcls,1,2) in ('01','02','03','04','05','06')

and a.sales_yymm between to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyy')-1||'01'

                     and to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyymm')  =  :arg_yymm

and a.cvcod like :arg_cvcod  /* 거래처 */

group by nvl(c.yebid1,b.itcls)

이 글에 대한 댓글이 총 1건 있습니다.

복잡한 쿼리네요.. 제가 저상황이라면 이렇게 하겠습니다.

분모가 0으로 떨어지는것 때문에 case를 쓴곳은 분모가 0일때 null이 되게 할것 같네요.

분모가 0이 되어서 값이 null로 보이는건 제일 밖에 nvl처리를 해서 0으로 넣으심 될것 같구요.

round(100*(sum(decode(a.sales_yymm,to_char(add_months(to_date(:arg_yymm,'yyyymm'),-1),'yyyymm'),a.sales_amt,0))-

       sum(decode(a.sales_yymm,to_char(add_months(to_date(:arg_yymm,'yyyymm'),-2),'yyyymm'),a.sales_amt,0)))/

       sum(decode(a.sales_yymm,to_char(add_months(to_date(:arg_yymm,'yyyymm'),-2),'yyyymm'),decode(a.sales_amt, 0, null, a.sales_amt),null)))


또 하나는 case문 안에 case를 넣었는데 비교하는게 같은 컬럼인것 같은데 왜 case안에 case를 넣었는지요.. 저라면 case 데이터 and 데이터 ... 이런식으로 처리를 하면 조금 나아질것 같습니다.

짧은 소견이였습니다.

자스민님이 2007-08-03 00:52에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
31523안녕하세요.dbs폴더를 ftp로 copy할때 특정 파일에 대한 에러입니다.ㅜㅜ [5]
답답해요~
2007-08-02
1972
31521insert into 문에 대해서 [2]
안영진
2007-08-01
1502
31520프로시져에서 where조건에 IN 파라미터 쓰는방법알려주세요 [4]
오가와
2007-08-01
2118
31519매출 쿼리 질문 입니다. [1]
김상태
2007-08-01
1957
31517오라클 Pro*C CGI 로 connect 할때 문제점..
하얀눈
2007-08-01
925
31515[질문] lock 타입중에
나루토
2007-08-01
1913
31514실행이 안되요... [1]
ㅁㅁㅁ
2007-07-31
991
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다