날짜 기준 조회 쿼리 작성 중 질문드립니다. 0 9 1,812

by CHOZZA [SQL Query] [2016.05.01 16:48:53]


SUM_RESULT.jpg (394,224Bytes)

SELECT DECODE(no, 3, null, substr(to_char(m_date,'yyyymmdd'),0,6)) m_mon,
       DECODE(no, 1, to_char(m_date,'yyyymmdd'), 2, null ) m_date,
       DECODE(no, 1, to_char(content), 2, '합계', 3, '총계') content,
       sum(buy_price),
       sum(sell_price)
FROM aa, (select rownum no from dual connect by level <= 3)
GROUP BY DECODE(no,3,null,substr(to_char(m_date,'yyyymmdd'),0,6)),
         DECODE(no,1,to_char(m_date,'yyyymmdd'),2,null ),
         DECODE(no, 1, to_char(content), 2, '합계', 3, '총계')
ORDER BY 1,2;

 

위에 나온 것이 작성한 쿼리고 아래에 나오는 사진이 쿼리 조회시 나온 화면입니다.

테이블은 AA 라는 테이블 하나구요,

컬럼은 m_date(날짜), content(내용), buy_price(구매가), sell_price(판매가)로 되어있습니다.

제가 원하는 것은, 저 조회된 화면에서 m_mon 열만 없었으면 좋겠습니다.

참, UNION ALL, GROUP BY ROLLUP은 사용하지 않아야합니다..

오로지 DECODE, GROUP BY, DUAL 테이블을 이용해서 해야합니다.

m_mon 뺴고도 나머지가 똑같이 조회되게 하려면 어떻게 바꿔야 할까요?

by 우리집아찌 [2016.05.02 08:38:46]
/* 그냥 지우면 될듯합니다만.. */
SELECT 
     --DECODE(no, 3, null, substr(to_char(m_date,'yyyymmdd'),0,6)) m_mon,
       DECODE(no, 1, to_char(m_date,'yyyymmdd'), 2, null ) m_date,
       DECODE(no, 1, to_char(content), 2, '합계', 3, '총계') content,
       sum(buy_price),
       sum(sell_price)
FROM aa, (select rownum no from dual connect by level <= 3)
GROUP BY DECODE(no,3,null,substr(to_char(m_date,'yyyymmdd'),0,6)),
         DECODE(no,1,to_char(m_date,'yyyymmdd'),2,null ),
         DECODE(no, 1, to_char(content), 2, '합계', 3, '총계')
ORDER BY 1,2;

 


by CHOZZA [2016.05.02 10:02:51]

빼고 돌려봤는데, 

맨 마지막 12월까지 그냥 쭉 조회 되고 합계랑 총계는 그다음부터 붙어서 좌르륵 나옵니다.

20151210 12월 세번째 630 830

              총계

               합계

               합계

                합계

 

이런식으로 나옵니다. 어떻게 해야할지 정말 막막합니다 흑흑.

 


by 우리집아찌 [2016.05.02 10:17:21]

정렬을 못봤네요.  정렬기준이라면 

INLINE VIEW 로 묶어서 다시 정렬하시는 방법도..


by CHOZZA [2016.05.02 10:57:28]

아찌님께서도 답변 주셔서 너무 감사해요. 수고하세요!


by 마농 [2016.05.02 10:04:35]

GROUP BY 는 그대로 두고 SELECT 절에서만 빼면 되긴 하는데요.
정렬이 중요하죠. 지금 숫자 1,2 로 정렬했으니 이부분도 바뀌어야 합니다.


방법은 여러가지가 있는데
지금 쿼리 바꾸지 말고 그대로 인라인뷰로 감싸서 Select 절에서만 m_mon 빼도 되구요.
인라인뷰 안쓰고 그냥 빼려면?
ORDER BY 절에 빼기전 표현식 그대로를 써주시면 됩니다.


ORDER BY DECODE(no,3,null,substr(to_char(m_date,'yyyymmdd'),0,6))
, DECODE(no,1,to_char(m_date,'yyyymmdd'),2,null ),


그런데 SELECT절에서 두번째 표현식의 알리아스를 컬럼명인 m_date 와 동일하게 주었기 때문에 문제가 됩니다.
GROUP BY 에서의 m_date 는 컬럼인데
ORDER BY 에서의 m_date 는 알리아스(두번째 표현식)가 됩니다.
서로 다른 항목이죠.
컬럼으로 인지해야 합니다. 다음과 같이 해야 합니다.


ORDER BY DECODE(no,3,null,substr(to_char(aa.m_date,'yyyymmdd'),0,6))
, m_date


첫번째 표현식에서는 aa.m_date 처럼 aa 를 붙여줘서 테이블의 컬럼임을 명시하구요.
두번째 표현식에서도 첫번째 표현식처럼 aa 를 붙여줘도 되지만
두번째 표현식 자체를 아예 통째로 알리아스인 m_date 로 교체해도 동일하죠.


by 마농 [2016.05.02 10:09:18]

UNION ALL, ROLLUP 을 쓰지 말아야 하는데?
CONNECT BY 구문은 써도 되는지 의문이네요?
DECODE 구문도 조금 장황하게 작성된 듯 하고요.
 

SELECT DECODE(no, 1, TO_CHAR(m_date, 'yyyymmdd')) m_date
     , DECODE(no, 3, '총계', 2, '합계', content)  content
     , SUM( buy_price)  buy_price
     , SUM(sell_price) sell_price
  FROM aa
     , (SELECT ROWNUM no FROM dict WHERE ROWNUM <= 3)
 GROUP BY DECODE(no, 3, '', TO_CHAR(m_date, 'yyyymm'))
     , DECODE(no, 1, TO_CHAR(m_date, 'yyyymmdd'))
     , DECODE(no, 3, '총계', 2, '합계', content)
 ORDER BY DECODE(no, 3, '', TO_CHAR(aa.m_date, 'yyyymm'))
     , m_date
;

 


by CHOZZA [2016.05.02 10:30:29]

숙제를 내주셨는데 UNION ALL하고 ROLL UP은 쓰지말고 되도록 DECODE랑 GROUP BY로 해보라고  하셔서요... 5일째 막혔습니다. 여기 써주신 코드대로 해보니 총계(데이터는 합계)부터 쫙 나오고 그 다음에

1월부터 12월까지 조회되고 마지막에 합계(데이터는 원래 1년 총계)라 뜨며 나옵니다. 답변 길게 해주셨는데 제가 못해서 죄송합니다..


by 마농 [2016.05.02 10:47:21]

제가 실수했네요.

쿼리 변경했습니다.


by CHOZZA [2016.05.02 10:56:56]

와.. 5일 째 묵은 체증이 내려가는 느낌입니다.. 삽질하면서 몰랐던 거도 많이 배우긴 했지만 완전히 막혀버려서 머리가 너무 아픈 상태였는데 정말 감사합니다 마농님.

바쁘신데 답변해주셔서 정말 감사합니다. 다시 공부해보겠습니다! 수고하세요!

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