안녕하세요 제가 검색조건으로써
검색기간: 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
이런 표 형태로 데이터를 출력하고싶습니다 어떻게 하면될까요?
행을 열로 바꾸는 쿼리도 검색해봤는데 검색기간에 따라서 표가 동적으로 보여야하기때문에
어려운것 같습니다. 고수님들의 답변 기다립니다 ㅠㅠ
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 ;
2. 그리고 날짜 조건은 틀렸습니다.
- (+ 1) 을 한다면 종료 조건에 이퀄(=)이 빠져야 합니다
- 이퀄(=)이 들어가려면 (+ 0.99999) 해야 합니다.
= BETWEEB 함수를 사용하는게 아니고 부등호를 사용하여 날짜검색을 해야하나요?
3. 날짜 조건이 애매합니다.
- 검색기간에 사용하는 날짜 : tb_diag_relt.regi_date
- 조회쿼리에 사용되는 날짜 : tb_smpl_item.regi_date
- 이 두가지가 서로 다르네요?
= 아 이건 제가 잘못한것같습니다...... 검색조건 날짜로 조회해야하는데 어떻게 할줄모르다보니
다른테이블 등록날짜로 조회해버렸네요...
* 혹시라도 동적쿼리를 만들어야한다면 어떻게 하는지 알려주실 수 있으신가요?
동적쿼리는 너무 높은산이네요 ..
1. between 도 부등호 검색과 다르지 않습니다.
- 양쪽에 이퀄이 붙을지 안붙을지가 중요한거죠.
- between 은 양쪽에 다 이퀄이 붙는 형태입니다.
2. 기준날짜는
- 업무 요건에 따라 정하셔야 합니다.
3. 동적쿼리는
- 프로그램을 통해 쿼리 문장을 만들어 내는 거라고 보시면 됩니다.
- 즉, 동적쿼리는 쿼리 영역이 아니라 프로그래밍 영역입니다.
- http://gurubee.net/article/19612