기간별 해당월만 조회 0 2 86

by 유선일 [Oracle 기초] [2017.12.05 17:24:38]


안녕하세요...

아래와 같이 조회 쿼리를 작성했습니다.

조회 기간(월)별로 
NVL( SUM( CASE WHEN SUBSTR(YYMM,5,2) = substr(:arg_yymm1,5,2) THEN mmQTY END ), 0 ) AS MON01
이 부분을 돌리고 싶습니다.

3개월을 돌릴수도 있고 4개월을 돌릴수도 있습니다.
변수기간 동안만 조회하고 싶은데 어떻게 해야 할까요?

프로그램에 코딩을 하면 FOR문으로 돌리겠는데 쿼리 문으로 작성할려니 도저히 모르겠습니다.

도움 부탁드립니다...꾸벅...^^

SELECT AA, 
      NVL( SUM( CASE WHEN SUBSTR(YYMM,5,2) = substr(:arg_yymm1,5,2) THEN mmQTY END ), 0 ) AS MON01
FROM MONPLAN
WHERE YYMM BETWEEN :arg_yymm1 AND :arg_yymm2
GROUP BY YYMM

----결과값----

     MON1   MON2  MON3  MON 4
AA  100       1000     300      200

by 고수가되고싶어요 [2017.12.05 18:04:05]
CREATE OR REPLACE FUNCTION fn_test (pd_arg_yymm1 VARCHAR2(8), pd_arg_yymm2 VARCHAR2(8)) 
    RETURN MONPLAN%ROWTYPE
    PIPELINED 
    
IS
TYPE MONPLAN_TABLE IS TABLE OF MONPLAN%ROWTYPE;
V_MONPLAN MONPLAN_TABLE;

BEGIN
  SELECT AA, 
        NVL( SUM( CASE WHEN SUBSTR(YYMM,5,2) = substr(:pd_arg_yymm1,5,2) THEN mmQTY END ), 0 ) AS MON01
  BULK COLLECT INTO V_MONPLAN
  FROM MONPLAN
  WHERE YYMM BETWEEN pd_arg_yymm1 AND pd_arg_yymm2
  GROUP BY YYMM
  
  FOR i IN 1..V_MONPLAN.COUNT LOOP
  PIPE ROW(V_MONPLAN.(i));
  END LOOP; 
  RETURN;

END;

잘...모르는 초보지만 저렇게 변수로 할려면 위와같이 함수만들어 써야하지 않나여? 

 


by 마농 [2017.12.05 18:20:09]

쿼리만으로는 가변 컬럼 불가능 합니다. 동적쿼리를 이용하셔야 합니다.
가변 기간의 최대 개월수 한계가 있다면? (예 : 조회는 12개월 이하로만 허용)
최대 개월수 만큼 고정으로 가는 방법이 있겠네요.

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