두테이블 간의 컬럼값 더하기 가능한가요? 0 6 841

by 열심열심 [2017.11.30 17:12:13]


a테이블 b테이블 구조는 똑같은 상태에서 

만약 a테이블이 홍길동 1000 2000 3000 값이고

b테이블 홍길동 3000 2000 2000 값이면 

이 값이 홍길동 4000 4000 5000이 되는 형식입니다. 

단, 숫자값도 sum한 결과 값입니다. 그래서 고민이 되네요. 

ex) select sum(a), sum(b) from test group by name? 훨씬 복잡하지면 간략하게하면 이런식입니다. 

현재 select a.name, sum(a) over(partition by name) from ( select sum(a), sum(b) from test1 union all select sum(a), sum(b) from test2) a

까지해서 더하긴했지만 2개씩 나오고 마지막에 0 값이 나오네요. 

by 박군two [2017.11.30 18:02:54]
-- 이런건가요?

WITH A AS (
     SELECT '홍길동' NM, 1000 NO1, 2000 NO2, 3000 NO3 FROM dual UNION ALL
     SELECT '아무개', 10, 20, 30 FROM dual
),
B AS (
     SELECT '홍길동' NM, 3000 NO1, 2000 NO2, 2000 NO3 FROM dual UNION ALL
     SELECT '아무개', 40, 50, 60 FROM dual
)
SELECT A.NM, 
       A.NO1 + B.NO1 NO1,
       A.NO2 + B.NO2 NO2,
       A.NO3 + B.NO3 NO3
FROM   A, B
WHERE  A.NM = B.NM

 


by 열심열심 [2017.12.01 08:31:02]

감사합니다. 많이 배우네요


by jkson [2017.11.30 19:30:41]

NM이 PK이거나 UNIQUE하다면 박군TWO님 말씀대로 하셔도 됩니다만..

UNIQUE한 속성이 전혀 없다면..

예를 들어 A 테이블이 홍길동이 2명 이상이라면 조인하면 안 되겠고요.

SELECT NM, SUM(NO1) NO1, SUM(NO2) NO2
  FROM
  (
  SELECT NM, NO1, NO2
    FROM   A
  UNION ALL
  SELECT NM, NO1, NO2
    FROM   B
  )
GROUP BY NM

 


by 열심열심 [2017.12.01 08:37:36]

감사합니다. 이런 쿼리를 짜려는 이유가 db부하를 줄이기 위한것인데 

매달 수십만건에 db가 쌓이고 이걸 가지고 통계정보를 만듭니다. 그렇기 때문에 

쿼리 조회 시간이 매우 느려져서 

제가 생각한건 전달통계는 통계결과 변화가 없으니 쿼리 결과를 view를 만들어 저장하면

부하가 줄지 않을까 생각해서입니다. 현재는 부하 때문에 최대 6개월 밖에 통계가 안쌓이지만 

이런 식으로하면 몇년 치도 문제 없이 쌓을수 있을 것 같은데

제 생각이 맞나요? 

  


by jkson [2017.12.01 11:54:29]

테이블 전체 데이터 기준으로 sum 하시는 거라면

단순 view로는 원하시는 속도는 안 나올 거구요.

materialized view를 적당히 활용하시거나 통계테이블을 하나 만드시는 게 좋을 것 같습니다.

통계 테이블을 따로 생성하시고 월말에 nm 별로 no1, no2, no3을 저장해놓고

당월 것까지 실시간으로 확인할 필요가 있다면

전월까지의 통계테이블 데이터와 당월 실시간 데이터를 sum해서 보여주는 방식으로 하면

속도는 어느 정도 나올 것 같네요.


by 열심열심 [2017.12.01 16:11:59]

이상하네요 제가 이때까지 생각한거랑 다르네요. ㅜㅠ

그리고 mview생성이 안되어서 찾아보니 EE버전만 지원하네요 ..

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