안녕하세요 검색조건 연도에 따라 테이블형식으로 출력하고싶습니다. 0 3 2,378

by 아이언조 [Tibero] ORACLE Tibero SQL DataBase DBA [2019.04.02 14:35:55]


안녕하세요 제가 검색조건으로써

검색기간: 2001-01-01  ~ 2019-04-01  [조회]

현재

SELECT 
 	 TO_CHAR(regi_date,'YYYY') AS regi_date
 	 ,smpl_smplkind 	
 	 ,NVL(COUNT(*),0) AS cnt
 	FROM tb_smpl_item
 	 	WHERE diag_req_no 
 	 	IN(
		  SELECT diag_relt_no
		  FROM  tb_diag_relt
		  WHERE del_yn = 'N'
		  AND regi_date BETWEEN TO_DATE('2001-01-01', 'YYYY-MM-DD') AND TO_DATE('2019-04-01', 'YYYY-MM-DD') + 1
		  )
		  GROUP BY (TO_CHAR(regi_date,'YYYY'),smpl_smplkind)
		 ORDER BY smpl_smplkind;  

조회하였을때 결과는

regi_date  |  smpl_smplkind  |  cnt

2017           SK01                  2

2018           SK01                  3

2019           SK01                  1

이렇게 출력이 되는데 null값은 0으로 하면서

출력되는 형태를 (* 데이터 숫자의값을 막 넣었으니 신경쓰지마세요)

연도  2001 ~ 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 

SK01  0      ~   0       0    1     2       2      1     3      4      0       0   

SK02  0       ~  0       0    1     2       2      1     3      4      0       0

이런  표 형태로 데이터를 출력하고싶습니다 어떻게 하면될까요?

행을 열로 바꾸는 쿼리도 검색해봤는데 검색기간에 따라서 표가 동적으로 보여야하기때문에

어려운것 같습니다. 고수님들의 답변 기다립니다 ㅠㅠ

 

 

 

 

by 마농 [2019.04.02 15:36:38]

1. 가변 컬럼은 불가능합니다.
  - 동적쿼리 이용하셔야 합니다.
  - 우선 정적 쿼리 알려드릴께요.
2. 그리고 날짜 조건은 틀렸습니다.
  - (+ 1) 을 한다면 종료 조건에 이퀄(=)이 빠져야 합니다
  - 이퀄(=)이 들어가려면 (+ 0.99999) 해야 합니다.
3. 날짜 조건이 애매합니다.
  - 검색기간에 사용하는 날짜 : tb_diag_relt.regi_date
  - 조회쿼리에 사용되는 날짜 : tb_smpl_item.regi_date
  - 이 두가지가 서로 다르네요?

SELECT smpl_smplkind
     , COUNT(DECODE(yyyy, '2001', 1)) "2001"
     , COUNT(DECODE(yyyy, '2002', 1)) "2002"
     , COUNT(DECODE(yyyy, '2003', 1)) "2003"
     , COUNT(DECODE(yyyy, '2004', 1)) "2004"
     , COUNT(DECODE(yyyy, '2005', 1)) "2005"
     , COUNT(DECODE(yyyy, '2006', 1)) "2006"
     , COUNT(DECODE(yyyy, '2007', 1)) "2007"
     , COUNT(DECODE(yyyy, '2008', 1)) "2008"
     , COUNT(DECODE(yyyy, '2009', 1)) "2009"
     , COUNT(DECODE(yyyy, '2010', 1)) "2010"
     , COUNT(DECODE(yyyy, '2011', 1)) "2011"
     , COUNT(DECODE(yyyy, '2012', 1)) "2012"
     , COUNT(DECODE(yyyy, '2013', 1)) "2013"
     , COUNT(DECODE(yyyy, '2014', 1)) "2014"
     , COUNT(DECODE(yyyy, '2015', 1)) "2015"
     , COUNT(DECODE(yyyy, '2016', 1)) "2016"
     , COUNT(DECODE(yyyy, '2017', 1)) "2017"
     , COUNT(DECODE(yyyy, '2018', 1)) "2018"
     , COUNT(DECODE(yyyy, '2019', 1)) "2019"
  FROM (SELECT TO_CHAR(regi_date, 'yyyy') yyyy
             , smpl_smplkind
          FROM tb_smpl_item
         WHERE diag_req_no IN (SELECT diag_relt_no
                                 FROM tb_diag_relt
                                WHERE del_yn = 'N'
                                  AND regi_date >= TO_DATE('2001-01-01', 'yyyy-mm-dd')
                                  AND regi_date <  TO_DATE('2019-04-01', 'yyyy-mm-dd') + 1
                               )
        )
 GROUP BY smpl_smplkind
 ORDER BY smpl_smplkind
;
SELECT *
  FROM (SELECT TO_NUMBER(TO_CHAR(regi_date, 'yyyy')) yyyy
             , smpl_smplkind
          FROM tb_smpl_item
         WHERE diag_req_no IN (SELECT diag_relt_no
                                 FROM tb_diag_relt
                                WHERE del_yn = 'N'
                                  AND regi_date >= TO_DATE('2001-01-01', 'yyyy-mm-dd')
                                  AND regi_date <  TO_DATE('2019-04-01', 'yyyy-mm-dd') + 1
                               )
        )
 PIVOT (COUNT(*) FOR yyyy IN ( 2001, 2002, 2003, 2004, 2005
                             , 2006, 2007, 2008, 2009, 2010
                             , 2011, 2012, 2013, 2014, 2015
                             , 2016, 2017, 2018, 2019
                             ) )
 ORDER BY smpl_smplkind
;

 


by 아이언조 [2019.04.02 16:40:11]

2. 그리고 날짜 조건은 틀렸습니다.
  - (+ 1) 을 한다면 종료 조건에 이퀄(=)이 빠져야 합니다
  - 이퀄(=)이 들어가려면 (+ 0.99999) 해야 합니다.

= BETWEEB 함수를 사용하는게 아니고 부등호를 사용하여 날짜검색을 해야하나요? 
  


3. 날짜 조건이 애매합니다.
  - 검색기간에 사용하는 날짜 : tb_diag_relt.regi_date
  - 조회쿼리에 사용되는 날짜 : tb_smpl_item.regi_date
  - 이 두가지가 서로 다르네요?

 

= 아 이건 제가 잘못한것같습니다...... 검색조건 날짜로 조회해야하는데 어떻게 할줄모르다보니

다른테이블 등록날짜로 조회해버렸네요... 

 

* 혹시라도 동적쿼리를 만들어야한다면 어떻게 하는지 알려주실 수 있으신가요? 
동적쿼리는 너무 높은산이네요 ..

 


by 마농 [2019.04.02 17:03:26]

1. between 도 부등호 검색과 다르지 않습니다.
 - 양쪽에 이퀄이 붙을지 안붙을지가 중요한거죠.
 - between 은 양쪽에 다 이퀄이 붙는 형태입니다.
2. 기준날짜는
 - 업무 요건에 따라 정하셔야 합니다.
3. 동적쿼리는
 - 프로그램을 통해 쿼리 문장을 만들어 내는 거라고 보시면 됩니다.
 - 즉, 동적쿼리는 쿼리 영역이 아니라 프로그래밍 영역입니다.
 - http://gurubee.net/article/19612

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