당월 수입과 전월 수입 & 당년 수입과 전년 수입을 구하는 쿼리 질문 입니다. 0 3 3,142

by DONKEY [SQL Query] 오라클 쿼리 수입 구하기 긴급 [2016.09.30 11:51:14]


안녕하십니까 구루비 회원님들!!

오늘도 업무에 관해 질문 사항이 있어 찾아오게되었습니다...하하

오늘 질문 사항은 현업의 요구 사항 변경으로 쿼리를 바꿔야되는데 모르겠네요..ㅠㅠ

제가 원하는결과값은 조회 구분을 월로 선택 했을 경우 조회 기준일자로 전월 수입과 당월 수입을 구하는 것이며

조회 구분을 년을 선택 했을 경우 조회 기준 년도로 전년수입과 당년 수입을 구하는 것입니다...

현재는 조회기간 FROM_YMD AND TO_YMD 사이의 값을 구하는 것이구요..

정리를 하자면..

서버로 넘길 파라미터 :

1.조회 구분 - 년인지 월인지

2.조회 구분에 따른 YYYY데이터 YYYYMM데이터

감사합니다!


SELECT CASE WHEN SUBSTR(B.GOODS_FLAG,1,1) IN ('B','G','E') THEN 'B001'
                     WHEN B.GOODS_FLAG IN ('A003', 'A004', 'A005') THEN 'A003'
                     ELSE B.GOODS_FLAG END AS GOODS_FLAG
              , CASE WHEN SUBSTR(B.GOODS_FLAG,1,1) IN ('B','G','E') THEN '장례물품 판매액'
                     WHEN B.GOODS_FLAG IN ('A003', 'A004', 'A005') THEN '염습비 및 사용료'
                     ELSE C.COM_NM END AS GOODS_FLAG_NM
              , SUM(A.SLE_AMT) - SUM(A.RDU_AMT) AS SLE_AMT
           FROM MLA_FUNLCALC A
              , MLB_FUNLBASCD B
              , OCS.ZMM_COM_CD C
          WHERE SUBSTR(A.ACPT_YMD,0,6) BETWEEN I_FROM_YM AND I_TO_YM
            AND A.VLD_YN = 'Y'
            AND A.GOODS_CD = B.GOODS_CD
            AND A.SLE_YMD BETWEEN B.FR_YMD AND B.TO_YMD
            AND C.DIV_CD = 'GOODS_FLAG_' || B.PART_FLAG
            AND B.GOODS_FLAG = C.COM_CD
          GROUP BY CASE WHEN SUBSTR(B.GOODS_FLAG,1,1) IN ('B','G','E') THEN 'B001'
                        WHEN B.GOODS_FLAG IN ('A003', 'A004', 'A005') THEN 'A003'
                        ELSE B.GOODS_FLAG END
                 , CASE WHEN SUBSTR(B.GOODS_FLAG,1,1) IN ('B','G','E') THEN '장례물품 판매액'
                        WHEN B.GOODS_FLAG IN ('A003', 'A004', 'A005') THEN '염습비 및 사용료'
                        ELSE C.COM_NM END
          ORDER BY 1
          ;

 

현재 데이터

항목 수입
안치료 657000
분향실료 922200
염습비 및 사용료 0
장례물품 판매액 39999898
주류 2323489
마른안주류 4564546
잡화류 456465
합계 456484984984

 

원하는 데이터

 

항목 전년/전월 수입 당년/당월 수입
A 12313546 123456
B 1234546 1234565
C 23485968 23459
D 24569498 5468
E 324594 35489498
F 4564846 468468
G 86468486 864846
합계 4564546 5465456


 

by DONKEY [2016.09.30 13:55:55]

         SELECT GOODS_FLAG
              , GOODS_FLAG_NM
              , NVL(CUR_SLE_AMT,0) AS CUR_SLE_AMT
              , NVL(PRE_SLE_AMT,0) AS PRE_SLE_AMT
           FROM (SELECT CASE WHEN SUBSTR(B.GOODS_FLAG,1,1) IN ('B','G','E') THEN 'B001'
                             WHEN B.GOODS_FLAG IN ('A003', 'A004', 'A005') THEN 'A003'
                             ELSE B.GOODS_FLAG END AS GOODS_FLAG
                      , CASE WHEN SUBSTR(B.GOODS_FLAG,1,1) IN ('B','G','E') THEN '장례물품 판매액'
                             WHEN B.GOODS_FLAG IN ('A003', 'A004', 'A005') THEN '염습비 및 사용료'
                             ELSE C.COM_NM END AS GOODS_FLAG_NM
                      , SLE_AMT
                      , 1 AS FLAG
                   FROM MLA_FUNLCALC A
                      , MLB_FUNLBASCD B
                      , OCS.ZMM_COM_CD C
                  WHERE 1 = CASE WHEN I_SRCH_FLAG = 'MM' AND SUBSTR(A.ACPT_YMD,0,6) = REPLACE(I_SRCH_YM,'-','') THEN 1
                                 WHEN I_SRCH_FLAG = 'YY' AND A.ACPT_YMD BETWEEN I_SRCH_YY || '0301' AND TO_CHAR(LAST_DAY(TO_DATE(I_SRCH_YY + 1 || '0201','YYYYMMDD')),'YYYYMMDD') THEN 1 END
                    AND A.VLD_YN = 'Y'
                    AND A.GOODS_CD = B.GOODS_CD
                    AND A.SLE_YMD BETWEEN B.FR_YMD AND B.TO_YMD
                    AND C.DIV_CD = 'GOODS_FLAG_' || B.PART_FLAG
                    AND B.GOODS_FLAG = C.COM_CD
                  UNION ALL
                 SELECT CASE WHEN SUBSTR(B.GOODS_FLAG,1,1) IN ('B','G','E') THEN 'B001'
                             WHEN B.GOODS_FLAG IN ('A003', 'A004', 'A005') THEN 'A003'
                             ELSE B.GOODS_FLAG END AS GOODS_FLAG
                      , CASE WHEN SUBSTR(B.GOODS_FLAG,1,1) IN ('B','G','E') THEN '장례물품 판매액'
                             WHEN B.GOODS_FLAG IN ('A003', 'A004', 'A005') THEN '염습비 및 사용료'
                             ELSE C.COM_NM END AS GOODS_FLAG_NM
                      , SLE_AMT
                      , 2 AS FLAG
                   FROM MLA_FUNLCALC A
                      , MLB_FUNLBASCD B
                      , OCS.ZMM_COM_CD C
                  WHERE 1 = CASE WHEN I_SRCH_FLAG = 'MM' AND SUBSTR(A.ACPT_YMD,0,6) = TO_CHAR(ADD_MONTHS(TO_DATE(REPLACE(I_SRCH_YM,'-',''),'YYYYMM'),-1),'YYYYMM') THEN 1
                                 WHEN I_SRCH_FLAG = 'YY' AND A.ACPT_YMD BETWEEN I_SRCH_YY-1 || '0301' AND TO_CHAR(LAST_DAY(TO_DATE(I_SRCH_YY || '0201','YYYYMMDD')),'YYYYMMDD') THEN 1 END
                    AND A.VLD_YN = 'Y'
                    AND A.GOODS_CD = B.GOODS_CD
                    AND A.SLE_YMD BETWEEN B.FR_YMD AND B.TO_YMD
                    AND C.DIV_CD = 'GOODS_FLAG_' || B.PART_FLAG
                    AND B.GOODS_FLAG = C.COM_CD)
                  PIVOT (SUM(SLE_AMT) 
                    FOR FLAG 
                     IN (1 AS CUR_SLE_AMT,2 AS PRE_SLE_AMT))

일딴좀 이상한방식으로 풀어봤는데... 어거지인거 같지만 값은 나오는듯 한데 혹시 더좋은 방법이 있을까요?


by 마농 [2016.09.30 16:13:24]
SELECT goods_flag
     , goods_flag_nm
     , NVL(SUM(DECODE(gb, 1, sle_amt - rdu_amt)), 0) AS sle_amt_1
     , NVL(SUM(DECODE(gb, 2, sle_amt - rdu_amt)), 0) AS sle_amt_2
  FROM (SELECT CASE WHEN SUBSTR(b.goods_flag,1,1) IN ('B','G','E') THEN 'B001'
                    WHEN b.goods_flag IN ('A003', 'A004', 'A005')  THEN 'A003'
                    ELSE b.goods_flag END AS goods_flag
             , CASE WHEN SUBSTR(b.goods_flag,1,1) IN ('B','G','E') THEN '장례물품 판매액'
                    WHEN b.goods_flag IN ('A003', 'A004', 'A005')  THEN '염습비 및 사용료'
                    ELSE C.COM_NM END AS goods_flag_nm
             , CASE WHEN i_gb = 'YYYY'   AND SUBSTR(a.acpt_ymd, 1, 4) = i_yyyy   THEN 2
                    WHEN i_gb = 'YYYYMM' AND SUBSTR(a.acpt_ymd, 1, 6) = i_yyyymm THEN 2
                    ELSE 1 END gb
             , a.sle_amt
             , a.rdu_amt
          FROM mla_funlcalc   a
             , mlb_funlbascd  b
             , ocs.zmm_com_cd c
         WHERE a.acpt_ymd >= CASE WHEN i_gb = 'YYYY'
                                  THEN (i_yyyy-1) || '0101'
                                  WHEN i_gb = 'YYYYMM'
                                  THEN TO_CHAR(ADD_MONTHS(TO_DATE(i_yyyymm, 'yyyymm'), -1), 'yyyymmdd')
                              END
           AND a.acpt_ymd <= CASE WHEN i_gb = 'YYYY'
                                  THEN i_yyyy || '1231'
                                  WHEN i_gb = 'YYYYMM'
                                  THEN i_yyyy_mm || '31'
                              END
           AND a.vld_yn = 'Y'
           AND a.goods_cd = b.goods_cd
           AND a.sle_ymd BETWEEN b.fr_ymd AND b.to_ymd
           AND c.div_cd = 'GOODS_FLAG_' || b.part_flag
           AND c.com_cd = b.goods_flag
        )
 GROUP BY goods_flag, goods_flag_nm
;

 


by DONKEY [2016.09.30 17:04:16]

답변 감사드립니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입