오라클 쿼리좀 부탁드립니다. 0 15 2,097

by 버드나무 [2017.09.11 21:36:54]


20170911_154302.jpg (3,118,825Bytes)

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으로 묶여서 열로 가게끔 해주실수 없을까요?

너무 어려워서 ...

고수님들 부탁좀 드리겠습니다.

by jkson [2017.09.12 08:11:19]

열이 동적으로 늘어나면 동적 쿼리를 쓰셔야 합니다.

//쿼리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',...

 


by 버드나무 [2017.09.12 10:25:46]

누락된 표현식이라고 나오네요.

이것때문에 지금 5일째 고민하고 있는데

확인좀 해주시면 안될까요?


by 마농 [2017.09.12 10:29:54]

단순하게 "에러납니다" 로 질문하시면 곤란합니다.
뭘 어떻게 실행했더니 난 에러인지 구체적으로 적어주셔야 합니다.
오라클 버전은 어찌 되나요? 위 쿼리는 11G 쿼리입니다.


by 버드나무 [2017.09.12 10:39:25]

오라클10g로 확인됩니다.

도와주세요


by 버드나무 [2017.09.12 10:40:51]

쿼리1은 잘되는데 pivot이 안먹는거 같아요


by 우리집아찌 [2017.09.12 10:44:49]

10G 에서는 지원안됩니다.

1번 쿼리 응용하세요.


by 버드나무 [2017.09.12 10:46:54]

그럼 저걸 어찌 짜야하는지 ?

혹시 알수없을까요?

지금 이것때문에  참...

스트레스 받아서...


by 우리집아찌 [2017.09.12 10:49:35]

jkson 님이 알려주실겁니다.. 

조금만 기다리세요.. ^^;

제가 조금 바빠서.. ㅎㅎ


by 버드나무 [2017.09.12 10:54:43]

네 ...

제발좀 부탁드립니다 


by jkson [2017.09.12 10:55:29]
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

사용하시는 그리드툴에서 자체적으로 해당 기능 지원할 수도 있으니 확인해보세요.


by 버드나무 [2017.09.12 11:31:19]

동적인거라서 이걸로 어찌해야 할지 ...

암튼 감사합니다.


by 마농 [2017.09.12 11:35:47]

동적 쿼리는 SQL 영역이 아닙니다. 프로그래밍 영역입니다.


by 김용한 [2017.09.12 16:25:47]

동적인부분은 ibatis 나 mybatis 또는 자바단에서 문자열로 쿼리를 짜신다면

for문에다가 저구분을 반복생산하시면되겠습니다.


by 버드나무 [2017.09.12 11:42:22]

네 알겠습니다 


by 우리집아찌 [2017.09.12 17:42:30]

PIVOT 사용하면 좀 편하겠는데 아쉽네요.

그냥 컬럼 하나로 받으셔서 SPLIT해서 쓰셔도 됩니다.

 

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