2014-11-26 6 views
2

, поэтому у меня есть вопрос, который не должен быть слишком трудным для ответа, но по какой-то причине я просто не могу его получить. Мне нужно суммировать затраты двух разных таблиц. Я пробовал сделать одно длинное соединение, но сами цифры ошибочны. Единственный способ получить правильные цифры - сделать два запроса и суммировать их вместе. Тем не менее, я хочу, чтобы они отображались под одним ID.Имея проблемы с суммированием двух частей Союза в MySQL

SELECT s.storeId, s.street, s.city, s.state, s.zipcode, SUM(p.cost) 
FROM store s 
JOIN video v ON s.storeId=v.storeId 
JOIN previousrental p ON v.videoid=p.videoid 
GROUP BY s.storeId 

UNION 

SELECT s.storeId, s.street, s.city, s.state, s.zipcode, SUM(r.cost) 
FROM store s 
JOIN video v ON s.storeId=v.storeId 
JOIN rental r ON v.videoid=r.videoid 
GROUP BY s.storeId 

ответ

1

Попробуйте это:

SELECT s.storeId, s.street, s.city, s.state, s.zipcode, SUM(p.cost) 
FROM store s 
INNER JOIN video v ON s.storeId=v.storeId 
INNER JOIN (SELECT p.videoid, SUM(p.cost) cost 
       FROM previousrental p 
       GROUP BY p.videoid 
       UNION 
       SELECT r.videoid, SUM(r.cost) cost 
       FROM rental r 
       GROUP BY r.videoid 
      ) AS p ON v.videoid=p.videoid 
GROUP BY s.storeId; 

ИЛИ

SELECT s.storeId, s.street, s.city, s.state, s.zipcode, 
     SUM(ISNULL(p.cost, 0) + ISNULL(r.cosr, 0)) 
FROM store s 
INNER JOIN video v ON s.storeId = v.storeId 
LEFT OUTER JOIN (SELECT videoid, SUM(cost) cost FROM previousrental GROUP BY videoid) p ON v.videoid = p.videoid 
LEFT OUTER JOIN (SELECT videoid, SUM(cost) cost FROM rental GROUP BY videoid) r ON v.videoid = r.videoid 
GROUP BY s.storeId; 
0

Одним из вариантов было бы поместить результаты в подзапрос:

SELECT 
    storeId, street, city, state, zipcode, SUM(cost) 
FROM 
    (SELECT s.storeId, s.street, s.city, s.state, s.zipcode, SUM(p.cost) cost 
    FROM store s 
    JOIN video v ON s.storeId = v.storeId 
    JOIN previousrental p ON v.videoid = p.videoid 
    GROUP BY s.storeId 
    UNION 
    SELECT s.storeId, s.street, s.city, s.state, s.zipcode, SUM(r.cost) 
    FROM store s 
    JOIN video v ON s.storeId = v.storeId 
    JOIN rental r ON v.videoid = r.videoid 
    GROUP BY s.storeId 
) T 
GROUP BY storeId 
0

Вы можете обернуть объединение в производной таблице, и причиной более, что:

SELECT x.storeId, x.street, x.city, x.state, x.zipcode, SUM(x.cost) 
FROM 
(
    SELECT s.storeId, s.street, s.city, s.state, s.zipcode, p.cost 
    FROM store s 
    JOIN video v ON s.storeId=v.storeId 
    JOIN previousrental p ON v.videoid=p.videoid 

    UNION 

    SELECT s.storeId, s.street, s.city, s.state, s.zipcode, r.cost 
    FROM store s 
    JOIN video v ON s.storeId=v.storeId 
    JOIN rental r ON v.videoid=r.videoid 
) x 
GROUP BY x.storeId, x.street, x.city, x.state, x.zipcode; 

Не забудьте группировать все неагрегатные столбцы в select, даже если они коррелированы!

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