월별 테이블에서 데이터 sum 하기 0 9 3,447

by 신이만든짝퉁 [2012.12.20 16:37:54]


안녕하세요.

테이블명이 월별로 구분되어 데이터가 저장된 테이블이 아래와 같이 있습니다.(총 테이블 24개)
이 테이블 구조는 모두  동일합니다.

- 테이블 구조 -

a_table : reg_date, user_id, score
b_table : reg_date, user_id, score


- 테이블 이름 -
a_table_201201
a_table_201202
a_table_201203
-  중략 -
a_table_201211
a_table_201212


b_table_201201
b_table_201202
b_table_201203
-  중략 -
b_table_201211
b_table_201212

참고 : a_table_201201 테이블에는 2012년 1월 데이터만 저장되어 있음, 다른 테이블도 동일함

위 테이블들에서 특정 사용자의 월별(2012년 1월 ~ 2012년 12월) 점수 합계를 모두 뽑아오려고 합니다.

아래는 제가 생각해 낸 2012년 1월 'testid'의 점수합계입니다.

select a.user_id, '201201' as ym, a.a_score, b.b_score
  FROM (
    select user_id, sum(score) as a_score
      from a_table_201201
     where user_id = 'testid'
     group by user_id
    ) a
 ,  (
    select user_id, sum(score) as b_score
      from b_table_201201
     where user_id = 'testid'
     group by user_id
    ) b
 WHERE a.user_id = b.user_id
;

원래 의도한 테이블의 결과는 이렇습니다.
user_id ym a_score b_score
testid 201201 1000 2000
testid 201202 500 1500
testid 201203 300 700
testid 201204 300 400
testid 201205 400 600
testid 201206 1500 300
testid 201207 200 1000
testid 201208 300 700
testid 201209 400 800
testid 201210 500 900
testid 201211 600 1000
testid 201212 1000 2000



위 쿼리 12번 UNION ALL 하는 방법 말고, 깔끔하게 12개월치 데이터를 모두 뽑아올 수 있는 방법이 있을까요?
고수님들의 조언 기다립니다.




by 부쉬맨 [2012.12.20 17:07:22]
딱히..
하나의테이블로 만들어야겠다라는 생각밖에안나네요..

by 손님 [2012.12.20 17:11:17]
테이블 구조 변경이 아니라면 UNION ALL이 정답이네요.

물론 쿼리는 조금 고쳐야... 특정 ID가 대상이므로 USER_ID로 GROUP BY할 이유가 없네요.

by 아발란체 [2012.12.20 17:17:44]
저도 UNION ALL이 정답인거 같아요.
동적 쿼리를 만드는 IMMEDIATE 써도 결국 UNION ALL이고요,

아님 부쉬맨님 말처럼 중간 집계 테이블을 두거나
아님 12개 테이블을 UNION ALL하는 VIEW 테이블을
A_TABLE 1개,  B_TABLE를 1개 만들어 두고

SELECT
    user_id, reg_date, SUM(a_score) AS a_score, SUM(b_score) AS b_score
FROM (
    SELECT user_id, reg_date, score AS a_score, 0 AS b_score FROM A_TABLE
    UNION ALL
    SELECT user_id, reg_date, 0, score FROM B_TABLE
)
GROUP BY
    user_id, reg_date
ORDER BY
    reg_date

하면 전체 뜨겠네요.

by 손님 [2012.12.20 17:20:46]
최선의 선택은 테이블을 하나로 합치고 월별 파티셔닝을 하시는게..

by 아발란체 [2012.12.20 17:23:11]

뷰 테이블은 다음과 같이 만드시면 되용..

CREATE OR REPLACE FORCE VIEW A_TABLE(user_id, reg_date, a_score) AS
    SELECT * FROM A_TABLE_201201
    UNION ALL
    SELECT * FROM A_TABLE_201202
    ....
    UNION ALL
    SELECT * FROM A_TABLE_201212

CREATE OR REPLACE FORCE VIEW B_TABLE(user_id, reg_date, a_score) AS
    SELECT * FROM B_TABLE_201201
    UNION ALL
    SELECT * FROM B_TABLE_201202
    ....
    UNION ALL
    SELECT * FROM B_TABLE_201212


by 아발란체 [2012.12.20 17:24:41]

오.. 위에 손님이 써주신 방법이 좋네요.
테이블 하나로 합치고 월별 파니셔닝!


by 아발란체 [2012.12.20 17:25:42]

by 신이만든짝퉁 [2012.12.20 17:38:52]
답변을 달아주신 모든분들께 감사드립니다.
아발란체님 말씀처럼 차라리 뷰를 만드는게 낫겟군요.  ^^
파티셔닝도 답이 될 것 같고요~

그렇게 해보도록 하겠습니다. ^^

by 부쉬맨 [2012.12.20 17:53:56]
아..
통계성 테이블뷰라면
Mview추천...
사용법은좀어렵지만 좋아보임 

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