데이터들에 평균 구하는 방법은 어떻게 해야?? 9 1,409

by 허브 [2008.10.20 12:15:13]


제목 없음.bmp (504,630Bytes)

게시판에 2011번에 글쓴 사람인데요

20070521,20070514,20070507에 데이터를 불러와서

각 필드에 데이터마다 일정한 계수를 곱해서 다른 테이블에 적재를 시켜놨습니다..

이렇게 적재된 데이터들에 평균을 구해서 보여주려고하는데

select sum(TD_OA) as SUM_OA, sum(TD_OB) as SUM_OB, sum(TD_OC) as SUM_OC, sum(TD_OD) as SUM_OD, sum(TD_OE) as SUM_OE, sum(TD_OF) as SUM_OF,sum(TD_OG) as SUM_OG, sum(TD_OH) as SUM_OH, sum(TD_OI) as SUM_OI,sum(TD_AO) as SUM_AO, sum(TD_AA) as SUM_AA, sum(TD_AB) as SUM_AB,sum(TD_AC) as SUM_AC, sum(TD_AD) as SUM_AD, sum(TD_AE) as SUM_AE,sum(TD_AF) as SUM_AF, sum(TD_AG) as SUM_AG, sum(TD_AH) as SUM_AH,sum(TD_AI) as SUM_AI, sum(TD_BO) as SUM_BO, sum(TD_BA) as SUM_BA,sum(TD_BB) as SUM_BB, sum(TD_BC) as SUM_BC, sum(TD_BD) as SUM_BD from system.ACCTEST_DS where yyyymmdt in to_char(to_date(’" + Date1 + "’,’yyyymmdd’)-(7*1), ’yyyymmdd’) or yyyymmdt in to_char(to_date(’" + Date1 + "’,’yyyymmdd’)-(7*2), ’yyyymmdd’) or yyyymmdt in to_char(to_date(’" + Date1 + "’,’yyyymmdd’)-(7*3), ’yyyymmdd’);

이렇게하면 더한 값들만이 되는데

저기서 sum을 avg로 바꾸니까 평균이 구해지긴하는데

데이터가 2테이블에서 불러와서 한테블에 적재시키는 거라서..

20070422을 입력하면 20070415 2개, 20070408 2개, 20070401 2개 총 6로우에 데이터가 적재되는데요

불러와질때 각 필드에 일정한 값을 곱해서 적재시키는 바람에 총 6행이 한번에 불어와집니다.

그런데 구하고자하는 평균은 3주라 6을 나눈 평균이 아닌 3을 나눈 평균을 구해야 하는데

3으로 나눌수 있는 평균은 어떻게하면 될지.. 여기까지 오는데 3주가 걸리네요 ㅠㅠ

 

by 유찬호 [2008.10.20 13:06:21]
이건 어떤지 ..?

with tab_dt as (SELECT to_char(to_date('20070421','yyyymmdd') + level, 'yyyymmdd') dt
FROM dual
CONNECT BY LEVEL < 110 )
select dt -- to_char(add_months(to_date('20070422','yyyymmdd')-21,0), 'yyyymmdd')
from tab_dt
where dt
-- ++++++++++++++++++++++++++++++++++++++++++++++++ --
in ( SELECT to_date('20070422','yyyymmdd') + (7 * (level -1) )
FROM dual
CONNECT BY LEVEL <= 3 )
-- ++++++++++++++++++++++++++++++++++++++++++++++++ --
;

by 호야 [2008.10.20 13:33:13]
말로만 너무 설명 해 놓으셔서.. 대충 감은 잡히지만

그냥 테이터를 적재 시켜서 나온 6개의 간단한 값과
그 값이 나오게 될 결과 값을 수정해서 보여 주세요

by 허브 [2008.10.20 13:37:02]
찬호님 감사합니다.. 근데 이해가 아직 ;;
레벨값을 줘서 레벨갯수로 나눠서 평균값을 구하는거같기도하고
아직 초짜라 좀더 자세히 알려주셨으면 ^^;;

by 허브 [2008.10.20 13:44:25]
호야님 글올려주셔서 고맙구요..
불러온 6개에 데이터를 drid된 부분 캡쳐해서 올렸습니다..
6개의 로우를 3으로 나누는 평균을 구하려고하는데요 결과값을 수정해서
보여주는건 어떤건지...??

by 도가니 [2008.10.20 13:53:47]
2개의 테이블에 해당날짜의 row를 가져온다는 말씀인가요? 그렇다면 두 테이블을 먼저 JOIN후 나온 데이터의 평균을 구하시면 될듯 한데,,,
아니면 한 테이블에 해달날짜의 row가 2개 이상이 있다는 말씀인가요? 그렇다면 해당날짜로 group by 후 각 날짜의 평균을 구해서 다시 전체 평균을 구하시면 될듯,,

아무래도 전자쪽 질문이신거 같은데,,

by 호야 [2008.10.20 13:54:17]
결과값의 수정이란 것은..
저 6개의 로우를 가지고.. 결과 값이 어떻게 나와야 되는지를 말하는 겁니다^^
YYYYMMDT TD_OA를 예로 들때
20070715 15320
20070715 22288
20070708 26810
20070708 11401.2
20070701 33030
20070701 3726.2
-----------------------------------
이 값이 원값인데... 결과 값이 어떻게 나와야 되나요?

by 호야 [2008.10.20 14:09:48]
먼지 감은 잡혔는데요.. 이 데이터가 썩이게 될 경우...
2개의 테이블에서 자료를 가지고 오기 때문에..
테이블을 적재 시킬때 어느 테이블에서 왔는지에 대한 구분적은 킬럼이 있어야
합니다.. 무작정 3으로 나누면.. 데이터가 썩이게 되고 자료는 맞지 않게되는
겁니다.. 그러니 저 상황에서 구분자가 있다면 GROUP BY 를 이용하여 AVG를
하시면 되겠지만 구분자가 없다면 적재 시키기 전에 구분자와 함께 적재를
시켜 주시면.. 쉽게 결과를 낼수 있으십니다.

by 호야 [2008.10.20 14:40:58]
WHERE DT IN (TO_CHAR(TO_DATE('" + Date1 + "','yyyymmdd')-7,'YYYYMMDD'),TO_CHAR(TO_DATE('" + Date1 + "','yyyymmdd')-14,'YYYYMMDD'),TO_CHAR(TO_DATE('" + Date1 + "','yyyymmdd')-21,'YYYYMMDD'))

WHERE 절은 이렇게 사용하시구요...
구분자가 필요 할 듯싶네요.
구분자라는 것은 위에 있는 TD_OA 6개 자료를
나누는 구역을 말하는 것이구요.. 아래 예시
YYYYMMDT TD_OA를 예로 들때
===================================
20070715 15320 <= 1번 테이블
20070715 22288 <= 2번 테이블
20070708 26810 <= 1번 테이블
20070708 11401.2 <= 2번 테이블
20070701 33030 <=1번 테이블
20070701 3726.2 <=2번 테이블

===================================

결과는
====================================
평균출처 평균
1번테이블 25053.3
2번테이블 12471.8



날짜별로 더하기해서 3으로 나눈 값이
나와야 되나요?

평균
---------------------------------------
37525.1

by 허브 [2008.10.20 15:03:20]
호야님 이렇게 까지 해주시니 너무 감사합니다.
설명이 미흡한데도 감을 잡으시니 굉장하시네요^^;

네 평균은 테이블별로 평균이 나와서 합한값이 맞아요
불러온데이터들을 3으로 나뉜값하고 동일하네요^^;

where절은 알겠는데요 아까 말씀해주신 group by(?) 구분자를
언제 써줘야하죠? 1번테이블과 2번 테이블에서 평균을
구하려는 테이블로 insert해줄때 해주는건지요? 어떻게 써주는건가요?