2015-01-02 2 views
0

하나의 SQL 쿼리에서 여러 테이블의 일부 열을 합산하려고하지만 잘못된 결과가 나타나는 것 같습니다. 나는 아래에서 제공 한 코드에 문제가 있다고 생각한다. 이것에 대한 도움을 주시면 감사하겠습니다. MySQL의 여러 테이블에서 열 합계

item Names 
| id | name | 
| 1 | AB | 
| 2 | CA | 

table1 
| id | interest | year | 
| 1 | 20.00 | 2014 | 
| 2 | 30.00 | 2013 | 
| 1 | 10.00 | 2013 | 

table2 
| id | deposit | year | 
| 1 | 10.00 | 2014 | 
| 2 | 10.00 | 2014 | 

은 내가 노력 쿼리입니다 :

SELECT 
     a.name, 
     b.year, 
     sum(b.interest) as 'total' 
    FROM 
     `table1` b 
    INNER JOIN 
     `item names` a 
    ON 
     b.id=a.id 
    GROUP BY 
     b.id 

UNION ALL 

    SELECT 
     c.name, 
     d.year, 
     sum(d.deposit) as 'total' 
    FROM 
     `table2` d 
    INNER JOIN 
     `item names` c 
    ON 
     d.id=c.id 
    GROUP BY 
     d.id 

예상 결과

UPDATE 내가 특정에 대한 관심과 보증금의 총합을 찾기 위해 노력하고

년 및 특정 항목에 대해

|name | year | total | 
| AB | 2014 | 30.00 | 
| AB | 2013 | 10.00 | 
| CA | 2013 | 30.00 | 
| CA | 2014 | 10.00 | 
+1

예상되는 결과가 정확히 무엇인지 설명해 주시겠습니까? 이드, 일년 총합을 찾는 것처럼 보입니까? – ryanyuyu

+0

1 년 단위로 그룹화해야합니다. –

+0

데이터가 2 년 이상 계속되었을 때 총 관심사로 정확히 무엇을 기대합니까? 다른 연도를 다른 행으로 표시하거나 모든 행에 대해 하나의 통합 된 결과를 표시 할 수 있습니다. 1 년 동안의 열은 그룹화 기준이 아니기 때문에이 시점에서는 아무 것도하지 않습니다. MySQL은 결과 셋의 첫 해를 다른 해의 관심사의 합계 옆에 표시합니다. 오해의 소지가 있습니다. 또한 구문은'b.sum (interest)'가 아니라'sum (b.interest)'입니다. – amenadiel

답변

1

게시 한 쿼리에서 결과를 얻으려면 1 년 단위로 그룹화해야합니다. 그런 다음 두 번째 세트에서 모든 행과 함께 첫 번째 세트에서 모든 행을 얻을 UNION를 사용할 수 있습니다 이름으로,

SELECT a.name, b.year, SUM(b.interest) AS total 
FROM names a 
JOIN table1 b ON b.id = a.id 
GROUP BY a.name, b.year 
UNION 
SELECT a.name, c.year, SUM(c.deposit) AS total 
FROM names a 
JOIN table2 c ON c.id = a.id 
GROUP BY a.name, c.year; 

그러나, 이것은 당신에게 당신의 최종 결과를 제공하지 않습니다 각 테이블 (예 : 'AB')에 나타나는 단어가 두 번 나타납니다. 한 해는 예금으로, 한 해는 관심사로 1 년.

다음
SELECT name, year, SUM(total) AS total 
FROM(
    SELECT a.name, b.year, SUM(b.interest) AS total 
    FROM names a 
    JOIN table1 b ON b.id = a.id 
    GROUP BY a.name, b.year 
    UNION 
    SELECT a.name, c.year, SUM(c.deposit) AS total 
    FROM names a 
    JOIN table2 c ON c.id = a.id 
    GROUP BY a.name, c.year) temp 
GROUP BY name, year; 

SQL Fiddle 예는 다음과 같습니다들을 결합하려면, 단지 이름과 날짜별로 합계 다시 그룹을 요약하면, 서브 쿼리로 위를 사용합니다.

+1

고마워요! 이것은 나를 위해 일했다. 다시 한 번 감사드립니다. – George

2

아마도 ... 아마도 table1과 table2가 같은 구조를 가지고 있다고 가정합니다.

먼저 하나와 두 개의 합집합 값으로 집합을 생성 한 다음 간단한 집계와 그룹 by을 사용하여 이름과 연도별로 값을 합산합니다.

+0

SQL Fiddle에서이 문제를 해결했으며 효과가있었습니다. 하나의 편집은 하위 쿼리에서'FROM'을 놓치고 있다는 것입니다. 나는 또한 약간 다르게 썼지 만 올바른 결과를주었습니다. 여기에 [피들] (http://sqlfiddle.com/#!2/21ba0/24) – AdamMc331

+0

시간 내 주셔서 감사합니다 @ xQbert – George