2012-06-21 4 views
3

나는 단순한 SQL SELECT 명령으로 생각했던 것에 몇 시간 동안 머리를 부순다. 나는 모든 것을 수색하여 내 것과 관련된 모든 질문을 읽었다. SQL Command Builder를 사용해 보았습니다. SQL 튜토리얼과 매뉴얼을 읽고 이해하고 처음부터 다시 빌드하려고 시도했습니다. (결국 저에게 꼭 필요한 명령입니다.) .세부터 SQL SELECT 및 SUM

하지만 지금은 원하는 결과를 얻지 못했지만 SELECT 명령을 구분하여 분리 할 수없는 것처럼 보입니다!

여기에 3 개의 테이블이 있습니다. 세 개의 테이블은 처음에는 공통 ID로 연결되고 두 번째 테이블은 다른 일반 ID로 연결되지만 첫 번째에서 세 번째의 공통 ID는 없습니다. B.amount의 해당 SUM으로, 각 A.id 및 A.name 및 표 B. 여러 양의 테이블 A. 여러 양

Table A : id, name 
Table B : id, idA, amount 
Table C : id, idB, amount 

여러 이름 표 C. 결과에서 원하는 :의 말합시다 해당 SUM의 C.amount와 비교하십시오. 의 말을하자 조항 및/또는 LEFT JOIN을 WHERE

A.id 
A.name 
SUM(B.amount) WHERE B.idA = A.id 
SUM(C.amount) WHERE C.idB = B.id for each B which B.idA = A.id 

그것은 "처음 세 개의 열"에 대한 괜찮아, 그리고 "처음 두 열 네 번째", 모두. 그러나 나는 모든 것을 망치지 않고 4 번째 열을 모으는 것을 성취 할 수 없다!

"쉽게 테이블 C에 idA 열을 넣을 수 있습니다"라고 말할 수 있습니다! 쉬워야합니다. 하지만 정말 필요한가요? 나는 그렇게 생각하지 않는다. 그러나 나는 틀릴 수있다! 그래서, 나는 (나는 영원한 "SQL God"장식을 줄 것이다) SQL 기술로 웃는 사람에게 "정말 간단하다. 그냥해라. 그러면 바보 같이된다.";)

VB 2010 및 MS SQL Server 실행

감사합니다!

+0

따라서, 데이터의 합계 결과 (일명 한 행)를 얻으려고합니다. A.id, A.name, sum (B.amount), sum (C.amount) B의 단일 A.id와 관련된 행 및 C의 B.id와 관련된 여러 행? –

+0

우리는 그렇게 말할 수 있다고 생각합니다. 하지만 각각의 (A.id 및 A.name)에 대해 "하나의 단일 행"이 아니라 단일 SUM (B.amount) 및 SUM (C.amount)을 확인하십시오. – Peter

답변

5

이 시도 :

SELECT A.Id, A.Name, ISNULL(SUM(B.amount), 0) as bSum, ISNULL(SUM(C2.Amount), 0) as cSum 
FROM A 
LEFT OUTER JOIN B ON A.Id = B.idA 
LEFT OUTER JOIN (SELECT C.idB, SUM(C.AMOUNT) AS Amount FROM C GROUP BY C.idB) AS C2 ON C2.idB = B.Id 
GROUP BY A.Id, A.Name 
+0

답변 해 주셔서 감사합니다! 이미 시도했지만, 아무런 결과도 얻지 못했습니다 ... – Peter

+0

@Peter는 나의 두 번째 예를 시도합니다. –

+0

@NathanWheeler 당신이 맞습니다, 나는 내 대답을 업데이 트했습니다. –

0
Select a.id, a.name, sum(b.amount), sum(c.amount) 
from a inner join b on a.id = b.idA 
inner join c on b.id = c.idB 
group by a.id, a.name 
+0

또는 클라우스의 답변! – dbrosier

+0

당신 덕분에 dbrosier도 물론 같은 "빈"결과! – Peter

+0

이것은 관련된 모든 Camount에 대해 여분의 Bamount를 계산합니다. –

0

를 별도로 추가해야합니다

select a.id, a.name, (coalesce(b.amount, 0.0) + coalesce(c.amount, 0.0)) 
from a left outer join 
    (select b.ida, sum(amount) as amount 
     from b 
     group by b.ida 
    ) b 
    on a.id = b.ida left outer join 
    (select b.ida, sum(amount) as amount 
     from c join 
      b 
      on c.idb = b.id 
     group by b.ida 
    ) c 
    on a.id = c.ida 

외부 조인하는 b와 c 기록이 존재하지 모두 수행 할 때 고려해야 주어진 이드.

+0

하위 선택을 외부 조인으로 수행 할 필요가 없습니다. –

+0

네, 맞습니다. 사람들은 이상한 명명 규칙을 가지고 있습니다. 서로 다른 테이블에서 같은 이름을 가진 두 개의 열이 서로 다른 것을 참조하는 것은 혼란 스럽습니다. 어쨌든 요점은 "b"를 초과 계산하는 것을 피하기 위해 합계를 두 번해야한다는 것입니다. –

+0

두 번째 하위 쿼리에서 모호한 열 이름'amount' ... 그리고 OP가 함께 추가 된 두 개의 열이 아닌'b.amount' 및'c.amount' 열이 별도로 필요하다고 생각합니다. –

2

이 시도 :

SELECT 
    a.id, 
    a.name, 
    sum(x.amount) as amountb, 
    sum(x.amountc) as amountc 
from a 
    left join (
     select 
      b.id, 
      b.ida, 
      b.amount, 
      SUM(c.amount) as amountc 
     from b 
     left join c 
      on b.id = c.idb 
     group by 
      b.id, 
      b.amount, 
      b.ida 
    ) x 
     on a.id = x.ida 
group by 
    a.id, 
    a.name 

이 당신에게 결과 당신이 찾고있는 설정을 제공해야합니다. 각 B.id에 대해 모든 C.Amount를 합한 다음 모든 결과를 단일 결과 집합에 모두 추가합니다. MSSQL에서 약간의 샘플 데이터로 테스트 해본 결과 예상대로 작동합니다.

+0

당신도 이것을 테스트 했으므로 +1 할 것입니다. –