이 결과물을 어떻게 해야 될까요...하루종일 질문만하게되네요... 0 9 2,164

by 재민띵 [2013.01.18 16:13:42]



select  case when 요일1 = '일' then day end as sunday,
    case when 요일1 = '월' then day end as monday,
    case when 요일1 = '화' then day end as tuesday,
    case when 요일1 = '수' then day end as wednsday,
    case when 요일1 = '목' then day end as thursday,
    case when 요일1 = '금' then day end as friday,
    case when 요일1 = '토' then day end as saturday
from (SELECT SUBSTR(:yymm,5,2) month, LEVEL  day
  , TO_CHAR(TO_DATE(:yymm||level,'yyyymmdd'),'dy') 요일1
  , TO_CHAR(TO_DATE(:yymm||level,'yyyymmdd'),'d')  요일2
   FROM dual
   CONNECT BY LEVEL <= TO_CHAR(LAST_DAY(TO_DATE(:yymm, 'yyyymm')), 'dd')) test1
  
이 결과를... 달력처럼 만들고싶습니다..ㅜㅜ한행에 쭈루루룩 나오게요...
by 아린 [2013.01.18 16:56:44]
SELECT MIN(case when 요일1 = '일' then day end) as sunday,
              MIN(case when 요일1 = '월' then day end) as monday,
              MIN(case when 요일1 = '화' then day end) as tuesday,
              MIN(case when 요일1 = '수' then day end) as wednsday,
              MIN(case when 요일1 = '목' then day end) as thursday,
              MIN(case when 요일1 = '금' then day end) as friday,
              MIN(case when 요일1 = '토' then day end) as saturday
  FROM (SELECT SUBSTR(:yymm,5,2) month, LEVEL  day
             , TO_CHAR(TO_DATE(:yymm||level,'yyyymmdd'),'dy') 요일1 
             , TO_CHAR(TO_DATE(:yymm||level,'yyyymmdd'),'d')  요일2
             , TO_CHAR(TO_DATE(:yymm||level,'yyyymmdd')+1,'iw')  주차
          FROM dual
        CONNECT BY LEVEL <= TO_CHAR(LAST_DAY(TO_DATE(:yymm, 'yyyymm')), 'dd')
        )        
 GROUP BY 주차     
 ORDER BY 주차   

by 제로 [2013.01.18 17:17:22]
select min(decode(d, '1', dd)) as sunday
   , min(decode(d, '2', dd)) as monday
   , min(decode(d, '3', dd)) as tuesday
   , min(decode(d, '4', dd)) as wednsday
   , min(decode(d, '5', dd)) as thursday
   , min(decode(d, '6', dd)) as friday
   , min(decode(d, '7', dd)) as saturday
from (select to_char(to_date(:yyyymm, 'yyyymm') + level-1, 'dd') dd
      , to_char(to_date(:yyyymm, 'yyyymm') + level-1, 'd') d
      , trunc(to_date(:yyyymm, 'yyyymm') + level-1, 'd') w
   from dual
   connect by level <= TO_CHAR(LAST_DAY(TO_DATE(:yyyymm, 'yyyymm')), 'dd'))
group by w
order by w
;

by 재민띵 [2013.01.18 17:23:00]

아린님 감사합니다 근데 질문이있습니다 주차는 왜 구하며 MIN을 쓰는건 어떤의미일까요 ㅜㅜ
이해가 안가네요 설명가능하시면 감사하겠습니다!!

by 재민띵 [2013.01.18 17:30:25]

제로님 감사합니다 ㅜㅜ 근데 전 주차를 왜 구하는지 이해가 잘안가네요ㅠㅠ
설명해주실수있으시면 감사하겟습니다

by 아린 [2013.01.18 17:36:57]
 select  case when 요일1 = '일' then day end as sunday,
           case when 요일1 = '월' then day end as monday,
           case when 요일1 = '화' then day end as tuesday,
           case when 요일1 = '수' then day end as wednsday,
           case when 요일1 = '목' then day end as thursday,
           case when 요일1 = '금' then day end as friday,
           case when 요일1 = '토' then day end as saturday, 주차 
from (SELECT SUBSTR(:yymm,5,2) month, LEVEL  day
                    , TO_CHAR(TO_DATE(:yymm||level,'yyyymmdd'),'dy') 요일1 
                    , TO_CHAR(TO_DATE(:yymm||level,'yyyymmdd'),'d')  요일2
                    , TO_CHAR(TO_DATE(:yymm||level,'yyyymmdd')+1,'iw')  주차
           FROM dual
     CONNECT BY LEVEL <= TO_CHAR(LAST_DAY(TO_DATE(:yymm, 'yyyymm')), 'dd'))


위 SQL 은 GROUP BY 와 MIN 하기 전 쿼리 입니다.

보시면 "주차" 부분이 아래와 같이 주별로 같이 나타납니다.   

일   월   화   수   목   금   토 주차
1 31
2 31
3 31
4      31
5 32
    6                32
7 32
8 32
9 32
10 32
11 32


위 결과를 한 ROW 로 나타낼려면 주차별로 GROUP BY 묶어주시고, 컬럼별로 MAX 나 MIN 으로 처리 하면 됩니다.

by 재민띵 [2013.01.18 17:58:57]

제가 궁금한걸 적어보겠습니다!
우선 1 IW는 해당년도의 주차를 알아서 끈어서 계산해주는식인가요?  
2 TO_CHAR(TO_DATE(:yymm||level,'yyyymmdd')+1,'iw') 에 +1은 어떤의미가 있는건가요?
3 왜 꼭 MAX나 MIn값을 줘야하는지 정확하게 이해가 안됩니다! 답변가능하시면 감사하겟습니다!ㅎㅎ
그리고 제로님이 작성해주신 SQL문은
select to_char(to_date(:yyyymm, 'yyyymm') + level-1, 'dd') dd
, to_char(to_date(:yyyymm, 'yyyymm') + level-1, 'd') d
, trunc(to_date(:yyyymm, 'yyyymm') + level-1, 'd') w
이 로우들에 -1이 왜들어가는건가요!?

by Oracler [2013.01.19 16:40:50]
MAX나 MIN과 같은 그룹함수를 주는 이유는 그룹함수는 NULL을 무시하고 계산하기 때문입니다.

예를 들어 '32주'로 그룹을 지으면 이 그룹에 총 7개의 행이 존재합니다. 요일 컬럼의 관점에서 보면 7개의 행 중 하나의 행에만 값이 있고 나머지 행들은 NULL이 됩니다. 따라서 요일 컬럼에 대해 MAX, MIN, SUM, AVG 등의 그룹함수를 적용하면 NULL은 무시하고 수행이 되죠.

그리고 그 결과로 7개의 행이 그룹함수에 의해 하나의 결과로 리턴, 즉 한 줄로 나타나게 되는 것입니다.


by 재민띵 [2013.01.21 09:29:17]
오라클러님 감사합니다 ㅎㅎㅎ
이해가 됬습니다!!ㅎㅎ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입