나온 결과값에서 더하는 방법 가르쳐주세요 0 9 834

by 손님 결과값 더하기 [2009.01.30 14:51:30]


SELECT RFT.SOFC,  
       FH_STIME, FH_ETIME, sum(DECODE(FH_FAULT,0,round((FH_ETIME-FH_STIME)*24*60),0))
            FROM  FT_RTU_FAULT_HST RFT, CN_RTU_INFO SMT
            WHERE RFT.EVT_ID   in (111,112,113,140)   AND
                  RFT.SOFC     = SMT.SOFC             AND
                  RFT.RTUID    = SMT.RTUID            AND
                  RFT.LINETYPE = SMT.LINETYPE         AND
                  RFT.SOFC     = :sofc_param          AND
                  FH_STIME BETWEEN to_date(:stime_param,'~''YYYYMMDDHH24MISS~') AND to_date(:etime_param ,'~''YYYYMMDDHH24MISS~')  
        
group by RFT.SOFC, 
       FH_STIME, FH_ETIME,(DECODE(FH_FAULT,0,round((FH_ETIME-FH_STIME)*24*60),0));

--------------------------------------------------------------------------------------------------------------------------------------

이렇게해서 실행시키면 sofc_param, stime_param, etime_param 의 파람값을 입력받아 sofc의 시작시간, 종료시간, 에러시간 값이 여러개가 나오게 되는되요. 여기서 파람값을 입력받은 stime_param(시작시간)부터 etime_param(종료시간)까지의 에러시간을 합계를 내고 싶습니다. 어떻게 하면 좋을까요?? 고수님들의 답변을 기다립니다.                                                                                                                                                                                             -------------------------------------------------------------------------------------------------------------------------------------------------

위의 코드를 실행시킬때 나오는 값

SOFC       FH_STIME(시작시간)                FH_ETIME(종료시간)          에러시간                  

2022      2008-12-26 오전 11:17:40      2009-01-28 오후 1:35:33       606
2022      2008-12-27 오후 2:10:10         2009-01-28 오후 1:35:33      315
2022      2009-01-02 오전 9:49:14         2009-01-28 오후 1:35:33      662
2022      2009-01-02 오후 1:57:07         2009-01-28 오후 1:35:33      926
2022      2009-01-15 오전 11:21:46       2009-01-28 오후 1:35:33      978
2022      2009-01-15 오전 11:54:51       2009-01-28 오후 1:35:33      747
2022      2009-01-15 오후 1:50:19         2009-01-28 오후 1:35:33      935
------------------------------------------------------------------------------------------------------------------------------------------------
원하는 값

SOFC       FH_STIME(시작시간)                FH_ETIME(종료시간)          에러시간                  

2022      2008-12-26 오전 11:17:40      2009-01-28 오후 1:35:33       5169

by 쪼렙 [2009.01.30 15:10:50]
http://www.gurubee.net/article/13465
이 강좌가 도움이 되실까요?

by 호야 [2009.01.30 15:18:43]
SELECT RFT.SOFC,
MIN(FH_STIME),MAX(FH_ETIME), sum(DECODE(FH_FAULT,0,round((FH_ETIME-FH_STIME)*24*60),0))
FROM FT_RTU_FAULT_HST RFT, CN_RTU_INFO SMT
WHERE RFT.EVT_ID in (111,112,113,140) AND
RFT.SOFC = SMT.SOFC AND
RFT.RTUID = SMT.RTUID AND
RFT.LINETYPE = SMT.LINETYPE AND
RFT.SOFC = :sofc_param AND
FH_STIME BETWEEN to_date(:stime_param,'~''YYYYMMDDHH24MISS~') AND to_date(:etime_param ,'~''YYYYMMDDHH24MISS~')

group by RFT.SOFC

SELECT 문과 GROUP BY 문만 살짝 바꾸면 나오지 않나요???

by 호야 [2009.01.30 15:20:20]
SELECT 문을

SELECT RFT.SOFC,
:STIME_PARAM FH_STIME,:ETIME_PARAM FH_ETIME, sum(DECODE(FH_FAULT,0,round((FH_ETIME-FH_STIME)*24*60),0))

by 질문자 [2009.01.30 15:49:49]
답변 정말 감사합니다. 또 한가지 물어볼게있는데 SELECT문에서 sum을 빼고 할려고 한다면 어떻게 해야 하나요? 이렇게...

그럼 SELECT RFT.SOFC,
FH_STIME, FH_ETIME, DECODE(FH_FAULT,0,round((FH_ETIME-FH_STIME)*24*60),0)

했더니 ORA-00979: not a GROUP BY expression 이런 오류가 나버리는군요. 그래서 GROUP BY절에 RFT.SOFC, FH_FAULT, FH_ETIME, FH_STIME; 이렇게 써주니 값이 합쳐지진 않고 여러개로 나와버립니다. 이건 어떻게 해야하나요??

by 마농 [2009.01.30 16:41:37]
sum을 빼고 하시려면 아예 group by도 같이 빼셔요.

by 질문자 [2009.01.30 18:06:04]
마농님 말씀대로 sum을 빼고 gorup by도 같이 빼주었으나 오류가 납니다.
ㅜㅜ 어떻게 해야하나요??

by 호야 [2009.01.30 18:30:34]
마농님의 말씀은 요래하라는건데욤

SELECT RFT.SOFC,
FH_STIME, FH_ETIME,DECODE(FH_FAULT,0,round((FH_ETIME-FH_STIME)*24*60),0)
FROM FT_RTU_FAULT_HST RFT, CN_RTU_INFO SMT
WHERE RFT.EVT_ID in (111,112,113,140) AND
RFT.SOFC = SMT.SOFC AND
RFT.RTUID = SMT.RTUID AND
RFT.LINETYPE = SMT.LINETYPE AND
RFT.SOFC = :sofc_param AND
FH_STIME BETWEEN to_date(:stime_param,'~''YYYYMMDDHH24MISS~') AND to_date(:etime_param ,'~''YYYYMMDDHH24MISS~')

이 결과물은 그룹화 하지 않기 ??문에 where 절에 있는 기간에 있는
모든 로우를 반환을 합니다.

단, 대표적인 것을 반환을 하고 싶다면, 바로 위의 쿼리에서 SELECT문을...
SELECT MIN(RFT.SOFC),
MIN(FH_STIME), MAX(FH_ETIME),MAX(DECODE(FH_FAULT,0,round((FH_ETIME-FH_STIME)*24*60),0))

만들어 주시면 결과는
2022 2008-12-26 오전 11:17:40 2009-01-28 오후 1:35:33 978

이런씩으로 나오게 되구요..

by 질문자 [2009.01.30 19:29:14]
답변 감사합니다~~~
이걸 계속 연구...하다보니 계속 궁금증이 많이 생기는 군요
에러시간 값이 합쳐져서 나오게 되잖아요 그럼 몇개를 합쳤는지 알수 있나요?
또 에러시간이 하나씩 나올때 에러시간만 "에러"라고 출력되게 할수도 있나요?
번거롭게 해서 죄송합니다~~

by 마농 [2009.01.30 19:32:32]
건수를 알고자 한다면 COUNT(*) 하시면 됩니다.
조건에 따라 다른 결과를 보고자 한다면 Case문을 이용하시면 됩니다.
CASE WHEN COUNT(*) = 1 THEN '에러' END
기본적인 함수사용법과 Group By의 사용법부터 익히셔야 합니다.
기본을 모르는 상태에서의 질문만으로는 스킬향상이 되질 않습니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입