날짜별 정지시간 추출하는 쿼리 질문요~~ 0 3 2,320

by 손님 날짜 [2008.11.10 15:58:58]


안녕하세요.

혼자서 쑈하다가 도저히 막혀서 이렇게 질문을 올립니다.

설비명         정지일자                  정지시간                    복구일자                      복구시간
(FAC)        (STOP_DT)             (STOP_TIME)             (RCV_DT)                  (RCV_TIME)
-----------------------------------------------------------------------------------------------------------
A                20080810                    14:30                      20080812                        15:30
B                20080811                    07:00                      20080814                        12:00
C                20080811                    11:30                      20080811                        17:00

이런 테이블이 있다고할때,

설비별 / 날짜별 정지시간을 추출하려고 합니다. 그렇다면 결과가 아래와 같이 나타나야 할텐데요...

설비명        날짜            정지된 시간
(FAC)         (DT)              (STP_TM)
--------------------------------------------
A            20080810            9.5
A            20080811            24
A            20080812            15.5
B            20080811            17
B            20080812            24
B            20080813            24
B            20080814            12
C            20080811            5.5

쿼리 도움좀 부탁드리겠습니다. 어떻게 간단히 할 수 있는 방법이 있을까요? ;;;

by 마농 [2008.11.10 17:26:49]
SELECT fac
, dt
, (rcv_dt_time - stop_dt_time) * 24 stp_tm
FROM
(
SELECT fac
, TO_CHAR(TO_DATE(stop_dt,'yyyymmdd') + lv - 1,'yyyymmdd') dt
, CASE WHEN lv = 1
THEN TO_DATE(stop_dt || stop_time,'yyyymmddhh24:mi')
ELSE TO_DATE(stop_dt,'yyyymmdd') + lv - 1
END stop_dt_time
, CASE WHEN lv = ilsu
THEN TO_DATE(rcv_dt || rcv_time,'yyyymmddhh24:mi')
ELSE TO_DATE(stop_dt,'yyyymmdd') + lv
END rcv_dt_time
FROM (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 100)
, (SELECT t.*, TO_DATE(rcv_dt,'yyyymmdd') - TO_DATE(stop_dt,'yyyymmdd') + 1 ilsu FROM t)
WHERE lv <= ilsu
ORDER BY fac, lv
)

by 글쓴이 [2008.11.10 17:58:06]
와우! 정말 감사합니다. 하루종일 끙끙 앓던건데....
정말 잘 돌아가네요 ^^

by 서성우 [2008.11.10 18:36:00]
WITH test AS(
SELECT 'A' fac , '20080810' stop_dt , '14:30' stop_time , '20080812' rcv_dt, '15:30' rcv_time FROM dual
UNION ALL
SELECT 'B', '20080811', '07:00', '20080814', '12:00' FROM dual
UNION ALL
SELECT 'C', '20080811', '11:30', '20080811', '17:00' FROM dual
)
SELECT fac 설비명,stop_dt 날짜,((24*60)-To_Number((SubStr(REPLACE(stop_time,':',''),1,2)*60)+Nvl(SubStr(REPLACE(stop_time,':',''),3,2),0)))/60 "정지된 시간" FROM
(SELECT DISTINCT aa.fac fac,Decode(bb.stop_dt,'',aa.stop_dt,bb.stop_dt) stop_dt,
Decode(bb.stop_dt,'','0',bb.stop_time) stop_time FROM
(SELECT * FROM
(SELECT distinct* FROM
(SELECT fac,(stop_dt-1)+LEVEL stop_dt,stop_time FROM
(SELECT fac,stop_dt,stop_time FROM test
UNION ALL
SELECT fac,rcv_dt,rcv_time FROM test)
CONNECT BY LEVEL < 4)) a
WHERE a.stop_dt <= (SELECT Max(rcv_dt) FROM test WHERE fac=a.fac GROUP BY fac)) aa ,
(SELECT fac,stop_dt,stop_time FROM test
UNION ALL
SELECT fac,rcv_dt,rcv_time FROM test) bb
WHERE aa.fac = bb.fac(+)
AND aa.stop_dt = bb.stop_dt(+)
ORDER BY aa.fac)


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