2011-01-13 5 views
1

표 : 쇼핑는 무시 where 절

shop_id shop_building shop_person shop_time 
1 1 Brian 40 
2 2 Brian 31 
3 1 Tom 20 
4 3 Brian 30 

테이블 : 건물

building_id building_city 
1  London 
2  Newcastle 
3  London 
4  London 

테이블 : 바나나

banana_id banana_building banana_amount banana_person 
1  2  1  Brian 
2  3  1  Brian 
2  1  1  Tom 
내가 지금은 나에게 바나나 각 사람의 양을 표시 할

런던에서 삽니다.

은이 코드를 사용 :

SELECT tt.*, tu.*, tz.*, 
      SUM(shop_time)   AS shoptime, 
      Ifnull(banana_amount, 0) AS bananas 
    INNER JOIN buildings tu ON tt.shop_building=tu.building_id 
    FROM shopping tt 
      LEFT OUTER JOIN (SELECT banana_person, banana_building, 
            SUM(banana_amount) AS banana_amount 
          FROM bananas 
          GROUP BY banana_person) tz 
      ON tt.shop_person = tz.banana_person AND tt.shop_building = tz.banana_building 
WHERE tu.building_city = 'London' 
    GROUP BY shop_person; 

을하지만 그것은 작동하지 않습니다. 그것은 너무 늦게 말하고있는 것처럼, 런던을보아야합니다. 무시합니다.

+1

'ignore'태그가 마음에 듭니다. –

답변

0

'각 사람이 런던에서 구입 한 바나나의 양'을 , 여기에 mssql의 작동 버전이 있습니다. 실제로 테이블을 다시 작성하여 올바른지 확인합니다.

다른 데이터베이스 시스템의 경우 SELECT 문에 ISNULL 이외의 다른 기능을 사용해야 할 수도 있습니다. (SUM, MIN, MAX)가 문제가되지 않는 한 -

SELECT tt.shop_person, 
    tt.shop_building, 
    SUM(tt.shop_time) AS shoptime, 
    ISNULL(SUM(tz.banana_amount), 0) AS bananas 
FROM dbo.shopping tt 
INNER JOIN dbo.buildings tu ON tt.shop_building = tu.building_id 
LEFT OUTER JOIN 
    (SELECT banana_person, banana_building, SUM(banana_amount) AS banana_amount 
     FROM bananas 
     GROUP BY banana_person, banana_building) tz 
    ON tt.shop_person = tz.banana_person AND tt.shop_building = tz.banana_building 
WHERE (tu.building_city = 'London') 
GROUP BY tt.shop_person, tt.shop_building 

나는 tz.banana_amount 주위에 집계 함수를 추가했다.

결과 :

shop_person shop_building shoptime bananas 
Brian  1    40  0 
Tom   1    20  1 
Brian  3    30  1 

나는 bananas 등 서로 다른 양의 주위를 연주하고 올바르게 작동합니다.

+0

내 첫 번째 게시물을 수정했습니다. 나는 쇼핑 테이블을 필요로 할까 걱정된다. 그래서 코드는 내가 처음 포스트에 가지고있는 코드와 꽤 비슷하게 보일 것이다 (Reason : http://stackoverflow.com/questions/4639722/left-outer-join -sum-doubles-problem) – Brian

+0

사실, group by 절이있는 쿼리에는 select 매개 변수로 *를 사용하지 않습니다. "예쁜"이란 무엇을 의미합니까? – marapet

+0

btw, subquery tz 여전히 banana_building 열이 없습니다. – marapet

1

이 방법을 시도해보십시오

SELECT 
    s.shop_person, sum(b.banana_amount) as Amt, , sum(shop_time) as TimeAmt 
FROM bananas b 
    INNER JOIN buildings bu ON b.banana_building = bu.building_id 
    INNER JOIN shopping s ON bu.building_id = s.shop_building 
WHERE 
    bu.building_city = N'London' 
GROUP BY s.shop_person 

이 쿼리는 다른, 그러나 당신이 원하는 것을 - 당신이 사용하고있는 데이터베이스 모른 채

+0

행운이 없습니다. 여전히 무시하고 바나나 테이블의 모든 것을 셀 수 있습니다. – Brian

+0

당신이 질의에 대해 언급 했습니까? – NetRat

+0

두려워하지 않습니다. 가능한 경우 OP에 게시 한 것과 매우 유사한 코드가 필요합니다 (이유 : http://stackoverflow.com/questions/4639722/left-outer-join-sum-doubles-problem) – Brian