table에 들어간 데이터 형식-----
rg_dt menu_id menu_nm count
20170828 menu01 메뉴1 5
20170828 menu02 메뉴2 7
20170828 menu03 메뉴3 3
20170830 menu01 메뉴1 6
20170830 menu03 메뉴3 4
20170903 menu03 메뉴3 3
table에 들어간 데이터 형식-----
between '20170820' and '20170910' 를 조건으로 쿼리를 한 결과를 보면,
20170820 | 20170821 | 20170823 | ... | 20170828 | 20170830 | 20170903 | ... | 20170910 | |
메뉴1 | 0 | 0 | 0 | ... | 5 | 6 | ... | 0 | |
메뉴2 | 0 | 0 | 0 | ... | 7 | ... | 0 | ||
메뉴3 | 0 | 0 | 0 | ... | 3 | 4 | 3 | ... | 0 |
위와 같이 쿼리를 짜도록 도움좀 부탁드립니다.
테이블에 날짜가 있든없든 다 나오도록 해야하고, 행에있는 날짜
가 group으로 묶여서 열로 가게끔 해주실수 없을까요?
너무 어려워서 ...
고수님들 부탁좀 드리겠습니다.
열이 동적으로 늘어나면 동적 쿼리를 쓰셔야 합니다.
//쿼리1 select listagg(''''||to_char(to_date('20170820','yyyymmdd') + level - 1,'yyyymmdd')||'''',',') within group(order by level) dt from dual connect by level <= to_date('20170910','yyyymmdd') - to_date('20170820','yyyymmdd') + 1
//쿼리2 with t(rg_dt, menu_id, menu_nm, cnt) as ( select '20170828', 'menu01', '메뉴1', 5 from dual union all select '20170828', 'menu02', '메뉴2', 7 from dual union all select '20170828', 'menu03', '메뉴3', 3 from dual union all select '20170830', 'menu01', '메뉴1', 6 from dual union all select '20170830', 'menu03', '메뉴3', 4 from dual union all select '20170903', 'menu03', '메뉴3', 3 from dual ) select * from t where rg_dt between '20170820' and '20170910' pivot(sum(cnt) rgcntsum for rg_dt in ( 쿼리1의 결과를 스트링값으로 append..))//'20170820','20170821','20170822','20170823',...
with t(rg_dt, menu_id, menu_nm, cnt) as ( select '20170820', 'menu01', '메뉴1', 5 from dual union all select '20170821', 'menu02', '메뉴2', 7 from dual union all select '20170823', 'menu03', '메뉴3', 3 from dual union all select '20170824', 'menu01', '메뉴1', 6 from dual union all select '20170825', 'menu03', '메뉴3', 4 from dual union all select '20170903', 'menu03', '메뉴3', 3 from dual ) select menu_nm -- 쿼리 만들 때 for문으로 아래 내용을 생성-- , nvl(sum(decode(rg_dt,'20170820',cnt)),0) "20170820" , nvl(sum(decode(rg_dt,'20170821',cnt)),0) "20170821" , nvl(sum(decode(rg_dt,'20170822',cnt)),0) "20170822" , nvl(sum(decode(rg_dt,'20170823',cnt)),0) "20170823" , nvl(sum(decode(rg_dt,'20170824',cnt)),0) "20170824" ..... , nvl(sum(decode(rg_dt,'20170910',cnt)),0) "20170910" from t where rg_dt between '20170820' and '20170910' group by menu_nm order by menu_nm
동적쿼리할 때 pivot문이 참 편한데.. 10g는 pivot문을 지원 안 해서 안 돼요.
프로그램단에서 쿼리를 위와 같이 동적으로 만드시거나..
혹은 아래와 같이 일자별로 출력된 쿼리를 프로그램단에서 가로로 변경하여야합니다.
select rg_dt , sum(decode(menu_id,'menu01',cnt)) menu01cnt , sum(decode(menu_id,'menu02',cnt)) menu02cnt , sum(decode(menu_id,'menu03',cnt)) menu03cnt from t where rg_dt between '20170820' and '20170910' group by rg_dt
사용하시는 그리드툴에서 자체적으로 해당 기능 지원할 수도 있으니 확인해보세요.