Кросс-соединение игнорирует пункт где - PullRequest
1 голос
/ 13 января 2011

Таблица: Шоппинг

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; 

Но это не работает.Как будто я слишком поздно говорю, что он должен выглядеть только в Лондоне, поскольку он игнорирует это.

Ответы [ 2 ]

1 голос
/ 13 января 2011

Попробуйте так:

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 голосов
/ 13 января 2011

Не зная, какую базу данных вы используете, вот рабочая версия для 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 и т. Д., И это работает правильно.

...