흠 너무 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)
|