2011-01-13 6 views
1

Таблица: Покупкиперекрестное соединение игнорирует, где положение

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

люблю тег «игнорировать» –

ответ

0

Не зная, что базы данных вы используете , вот рабочая версия для mssql. Я фактически перестроил таблицы, чтобы убедиться, что это правильно.

Для других систем баз данных вам, вероятно, придется использовать другую функцию, чем ISNULL в инструкции SELECT.

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 - что один (SUM, MIN, MAX) не имеет значения.

Результат:

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

Я играл с различными количествами в bananas и т.д., и она работает правильно.

+0

Отредактировано мое первое сообщение. Боюсь, мне тоже нужен торговый стол, поэтому код должен выглядеть очень похожим на тот, который у меня есть в первом сообщении (Причина: http://stackoverflow.com/questions/4639722/left-outer-join -sum-doubles-problem) – Brian

+0

На самом деле, я бы не добавил никаких * в качестве параметров в запросе с предложением group by. Что вы подразумеваете под «симпатичным»? – marapet

+0

Кстати, в подзапросе 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

Упомянутый запрос ok для вас? – NetRat

+0

Не бойтесь, так как мне нужно, чтобы код был довольно похож на тот, который я опубликовал в OP, если это возможно (Причина: http://stackoverflow.com/questions/4639722/left-outer-join-sum-doubles-problem) – Brian

 Смежные вопросы

  • Нет связанных вопросов^_^