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 |
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))
일딴좀 이상한방식으로 풀어봤는데... 어거지인거 같지만 값은 나오는듯 한데 혹시 더좋은 방법이 있을까요?
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 ;