2014-11-06 5 views
0

두 테이블이 있습니다. 이 두 테이블의 각 행을 table3의 행으로 결합해야합니다. 나는 그럭저럭 테이블 1 SUM의 양을 얻을 수 있었지만 table2는 얻을 수 없었다.두 개의 다른 테이블에서 MYSQL 합계

예 :

테이블 사용자

+---------+-----------+ 
| user_id | user_name | 
+---------+-----------+ 
| 001  | JOHN | 
| 002  | ADAM | 
+---------+-----------+ 

+-----------+----------------+-------------------+---------------------+ 
| table1_id | table1_user_id | table1_amount |  table1_date | 
+-----------+----------------+-------------------+---------------------+ 
| 6  | 001   | 100   | 01/11/2014 10:55 | 
| 7  | 002   | 100    | 01/11/2014 10:55 | 
| 8  | 001   | 50    | 25/10/2014 10:55 | 
| 9  | 001   | 100    | 23/10/2014 11:00 | 
| 10  | 002   | 0    | 21/10/2014 11:00 | 
+-----------+----------------+-------------------+---------------------+ 

표 2

+-----------+----------------+----------------+--------------------+ 
| table2_id | table2_user_id | table2_amount | table2_date  | 
+-----------+----------------+----------------+--------------------+ 
| 1  | 001   | 100   | 15/11/2014 10:55 |  
| 2  | 001   | 100   | 15/10/2014 10:55 |  
| 3  | 002   | 100   | 11/10/2014 10:55 |  
| 4  | 001   | 50   | 11/10/2014 10:55 |  
+-----------+----------------+----------------+--------------------+ 

예상 결과 :

표 3

+-----+---------+---------------+---------------+----------+---------+ 
| id | user_id | table1_amount | table2_amount | Year | Month | 
+-----+---------+---------------+---------------+----------+---------+ 
| 1 | 001 | 100  |  100  |  2014 | 11 | 
| 2 | 002 | 100  |  0  |  2014 | 11 | 
| 3 | 001 | 150  |  150  |  2014 | 10 | 
| 4 | 002 |  0   |  100  |  2014 | 10 | 
+-----+---------+---------------+---------------+----------+---------+ 

내 시도하지만 예상 된 결과가 표시되지 않습니다. 모든 행에 table2_amount의 양은 NULL입니다 :

SQL=" INSERT INTO table3 
     SELECT user_id,SUM(table1_amount),t2.amount2, 
     YEAR(table1_date),MONTH(table1_date) FROM table1 a 
     LEFT JOIN 
    (SELECT c.table2_user_id,SUM(c.table2_amount) as amount2,c.table2_date 
       FROM table2 c 
     GROUP BY DATE_FORMAT(c.table2_date,'%Y-%m'),c.table2_user_id ASC 
      ) t2 
    on t2.table2_user_id = a.table1_user_id AND t2.table2_date = a.table1_date 
    GROUP BY DATE_FORMAT(a.table1_date,'%Y-%m'),table1_user_id ASC "; 
" 
+0

당신이 "작동하지 않습니다"무엇을 의미합니까 :

이이 사건에 대한 내 대답을 간다? 오류가 발생 했습니까? 나쁜 결과를 얻었습니까? 자세한 내용을 알려주십시오 –

+0

예상 결과가 표시되지 않아 죄송합니다. 이름에 대한 @no 아이디어 – xyonme

+0

왜 왼쪽 가입을 사용 했습니까? 테이블 조인 방법은 무엇입니까? –

답변

1

이 멋진 작업 계몽 토론 David162795 덕분에

SELECT tx.uid,SUM(tx.a1),SUM(tx.a2),YEAR(tx.d),MONTH(tx.d) 
FROM 
(
SELECT t1.table1_user_id as uid, 
    t1.table1_amount as a1, 
    0 as a2, 
    t1.table1_date as d 
    FROM table1 t1 
UNION 
SELECT t2.table2_user_id as uid, 
    0 as a1, 
    t2.table2_amount as a2, 
    t2.table2_date as d 
    FROM table2 t2 
) tx 
GROUP BY DATE_FORMAT(d,'%Y-%m'),uid ASC 
+0

안녕 데이비드. Thnak Answer.하지만 table1_id와 table2_id가 같지 않고 같은 수의 행이 없을 수도 있습니다. 귀하의 SQL을 적용했지만이 오류가 발생했습니다. "# 1222 - 사용 된 SELECT 문의 열 수가 다릅니다." – xyonme

+0

공용어에는 문제가 없으며 쿼리를 완전히 복사 했습니까? 이 오류는 두 개의 하위 쿼리 중 하나에서 열을 놓쳐 야 함을 의미합니다. – David162795

+0

사실 테이블 ID는 사용되지 않기 때문에 필요하지 않습니다. 사용자 ID 만 사용하십시오. 나는 대답에서 그것을 제거했다. – David162795

0

UNION을 위해.

두 테이블의 날짜가 다른 경우 누락 된 포인트는 날짜와 사용자 ID별로 그룹 INNER QUERY입니다. 내부 쿼리에서 개별 날짜별로 그룹화 한 다음 기본 SELECT 쿼리를 시간 변수별로 그룹화해야합니다.

$SQL = " 
INSERT INTO table3 (user_id, table1_amount, table2_amount,Year, Month) 
SELECT tx.uid, SUM(tx.sum1), SUM(tx.sum2),YEAR(tx.d) as year,MONTH(tx.d) as month 
    FROM 
    (SELECT b.table1_user_id as uid,b.table1_amount as sum1,0 as sum2, 
      b.table1_date as d FROM table1 b 
    GROUP BY DATE_FORMAT(d,'%Y-%m'),uid ASC 

    UNION 

    SELECT c.table2_user_id as uid,0 as sum1, 
      sum(c.table2_amount) as sum2,c.table2_date as d1 
       FROM table2 c 
    GROUP BY DATE_FORMAT(d1,'%Y-%m'),uid ASC 
) tx 

GROUP BY year,month,uid" 
관련 문제